当我从命名空间外调用一个在命名空间中声明的函数时,通常需要用命名空间显式前缀:
namespace ns1 {
void myfunc();
}
myfunc(); // compiler complains
ns1::myfunc(); // good
然而,我遇到了这样一种情况:编译器似乎可以自动推断出我想要使用的函数。
namespace mymath {
struct Vector3 {
float x, y, z;
};
Vector3 vector_cross(const Vector3& lhs, const Vector3 &rhs)
{
return lhs; // Pretend this is a cross product
}
} // ns
int main(int argc, char** argv)
{
mymath::Vector3 v, w, x;
x = vector_cross(v, w); // <---- Here, I do not need to
// prefix with the namespace
return 0;
}
Q1:是因为编译器可以根据参数类型自动选择适当的函数吗?还是其他原因?
经过更多测试,我发现如果我在另一个命名空间中添加具有相同声明的另一个函数,我的编译器不会报错:
namespace mymath {
// same as above
} // ns
namespace math2 {
mymath::Vector3 vector_cross(const mymath::Vector3& lhs, const mymath::Vector3 &rhs)
{
return rhs; // Return rhs this time
}
} // ns
int main(int argc, char** argv)
{
mymath::Vector3 v, w, x;
x = vector_cross(v, w); // <---- Here, which one did the compiler chose?
return 0;
}
Q2:如何取消这个行为?
编辑:
我的编译器:gcc版本4.7.2(Debian 4.7.2-5)
main()
函数--我把它放回来了,这样大家就可以复制/粘贴代码了。然而,我根本没有使用任何using
语句。 - Julien-L