'sqrt': неоднозначный вызов перегруженной функции ..\assimp\vector3.inl

Ошибка

ошибка C2668: 'sqrt': неоднозначный вызов перегруженной функции c:\program files\assimp\include\assimp\vector3.inl

происходит, когда я включаю «scene.h» в основной файл cpp:

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <GL/glew.h>
#include <GLFW/glfw3.h>
GLFWwindow* window;
#include <glm/glm.hpp>
#include <glm/gtx/transform.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <assimp/Importer.hpp>
#include <assimp/scene.h>
#include <assimp/postprocess.h>
#define MESH_FILE "cube.obj"
using namespace glm;
#include "common/shader.hpp"
#include "common/controls.hpp"

Я не могу понять, с чем это конфликтует?


person RevanReborn    schedule 09.05.2014    source источник
comment
включает ли пространство имен glm функцию sqrt?   -  person ratchet freak    schedule 09.05.2014
comment
@ratchetfreak Я думаю, да, так как это математическая библиотека, но почему они конфликтуют?   -  person RevanReborn    schedule 09.05.2014
comment
потому что sqrt(var) может относиться либо к стандартному sqrt, либо к glm   -  person ratchet freak    schedule 09.05.2014
comment
@RevanReborn: если glm действительно содержит sqrt, то сброс содержимого пространства имен в глобальное пространство имен с using namespace glm; вызовет конфликт с тем, что находится в библиотеке C. Никогда не стоит так загрязнять глобальное пространство имен.   -  person Mike Seymour    schedule 09.05.2014
comment
@ratchetfreak о, черт.. конечно..   -  person RevanReborn    schedule 09.05.2014
comment
Как закрыть этот вопрос?   -  person RevanReborn    schedule 09.05.2014
comment
@RevanReborn 'Как мне закрыть этот вопрос?' Мы можем попробовать для вас, я проголосую за ОТ, если хотите.   -  person πάντα ῥεῖ    schedule 09.05.2014


Ответы (1)


У вас есть пространство имен using-directive в вашем файле .cpp:

using namespace glm;

Это означает, что все, что находится в пространстве имен glm, становится частью «глобального» пространства имен; поэтому вы загрязняете глобальное пространство имен.

Таким образом, может возникнуть некоторая форма конфликта между стандартной функцией C sqrt() (которая находится в глобальном пространстве имен) и вашей glm::sqrt(), которая "повышена" до глобальной sqrt.

Вы можете удалить вышеупомянутую директиву использования пространства имен (и просто добавить префикс пространства имен glm::, если хотите ссылаться на классы и функции в этом пространстве имен).

person Mr.C64    schedule 09.05.2014