具有重载 r 值引用函数的模糊调用
Ambiguous call with overloaded r-value reference function
我有一个包含以下声明的 class:
class IcoSphere
{
[...]
private:
int _addVertex(const glm::vec3 &p);
int addVertex(glm::vec3 p);
int addVertex(const glm::vec3 &&p);
[...]
};
然后,我会这样调用 'addVertex':
IcoSphere sphere;
double t = (1.0 +sqrt(5.0)) /2.0;
sphere.addVertex(glm::vec3(-1,t,0));
'addVertex' 的参数显然不是引用,但 g++ 编译器抛出以下错误:
./network/icosphere.cpp: In static member function ‘static void IcoSphere::Create(glm::vec3&, float, std::vector<glm::tvec3<float, (glm::precision)0u> >&, int)’:
./network/icosphere.cpp:46:36: error: call of overloaded ‘addVertex(glm::vec3)’ is ambiguous
sphere.addVertex(glm::vec3(-1,t,0));
^
./network/icosphere.cpp:46:36: note: candidates are:
./network/icosphere.cpp:19:5: note: int IcoSphere::addVertex(glm::vec3)
int IcoSphere::addVertex(glm::vec3 p) {_addVertex(p);}
^
./network/icosphere.cpp:20:5: note: int IcoSphere::addVertex(const vec3&&)
int IcoSphere::addVertex(const glm::vec3 &&p) {_addVertex(p);}
^
这对我来说没有多大意义,为什么它认为这是一个模棱两可的调用?
编译器在处理函数重载解析时,首先获取所有可行的函数,然后对它们进行排序,并调用排名最高的函数。
然而,例如,在
type var;
void func(type);
void func(type&&);
func(var);
两种func
方法的排名相同。它们都是完全匹配的。不需要提升或隐式类型转换或其他任何东西。你的问题也是同样的情况。
所以你可能想改变
int addVertex(glm::vec3 p);
至
int addVertex(const glm::vec3& p);
因为你不打算改变它。关于重载决议和右值引用重载决议的更多信息,http://www.dcs.bbk.ac.uk/~roger/cpp/week20.htm, http://yapb-soc.blogspot.com/2015/01/rvalue-references-and-function.html
我有一个包含以下声明的 class:
class IcoSphere
{
[...]
private:
int _addVertex(const glm::vec3 &p);
int addVertex(glm::vec3 p);
int addVertex(const glm::vec3 &&p);
[...]
};
然后,我会这样调用 'addVertex':
IcoSphere sphere;
double t = (1.0 +sqrt(5.0)) /2.0;
sphere.addVertex(glm::vec3(-1,t,0));
'addVertex' 的参数显然不是引用,但 g++ 编译器抛出以下错误:
./network/icosphere.cpp: In static member function ‘static void IcoSphere::Create(glm::vec3&, float, std::vector<glm::tvec3<float, (glm::precision)0u> >&, int)’:
./network/icosphere.cpp:46:36: error: call of overloaded ‘addVertex(glm::vec3)’ is ambiguous
sphere.addVertex(glm::vec3(-1,t,0));
^
./network/icosphere.cpp:46:36: note: candidates are:
./network/icosphere.cpp:19:5: note: int IcoSphere::addVertex(glm::vec3)
int IcoSphere::addVertex(glm::vec3 p) {_addVertex(p);}
^
./network/icosphere.cpp:20:5: note: int IcoSphere::addVertex(const vec3&&)
int IcoSphere::addVertex(const glm::vec3 &&p) {_addVertex(p);}
^
这对我来说没有多大意义,为什么它认为这是一个模棱两可的调用?
编译器在处理函数重载解析时,首先获取所有可行的函数,然后对它们进行排序,并调用排名最高的函数。
然而,例如,在
type var;
void func(type);
void func(type&&);
func(var);
两种func
方法的排名相同。它们都是完全匹配的。不需要提升或隐式类型转换或其他任何东西。你的问题也是同样的情况。
所以你可能想改变
int addVertex(glm::vec3 p);
至
int addVertex(const glm::vec3& p);
因为你不打算改变它。关于重载决议和右值引用重载决议的更多信息,http://www.dcs.bbk.ac.uk/~roger/cpp/week20.htm, http://yapb-soc.blogspot.com/2015/01/rvalue-references-and-function.html