示例代码:
namespace lx1
{
class Point3D
{
public:
Point3D(double dx, double dy, double dz)
: m_dX(dx)
, m_dY(dy)
, m_dZ(dz){}
double getX() const { return m_dX; }
double getY() const { return m_dY; }
double getZ() const { return m_dZ; }
private:
double m_dX;
double m_dY;
double m_dZ;
};
void TestPoint(const Point3D& pt)
{
cout << "lx1::TestPoint()" << endl;
}
}
namespace lx2
{
void TestPoint(const lx1::Point3D& pt)
{
cout << "lx2::TestPoint()" << endl;
}
void ShowPoint3D(const lx1::Point3D& pt)
{
TestPoint(pt);
cout << "X : " << pt.getX() << endl;
cout << "Y : " << pt.getY() << endl;
cout << "Z : " << pt.getZ() << endl;
}
}
上面的代码无法通过编译,错误如下:
'lx2::TestPoint' : ambiguous call to overloaded function
也就是,编译器无法确定在ShowPoint3D()函数中调用的是哪个TestPoint()。
在C++中有这样一个名字查找规则:如果在声明函数的参数时使用了一个雷,那么在查找匹配的函数名字时,编译器会在包含该参数类型的命名空间中也进行查找。
在上面的代码中,命名空间lx2中的TestPoint()函数参数是lx1::Point3D。按照上面的规则,编译器在查找匹配的函数时,也会去包含类Point3D的命名空间(也就是lx1)中进行匹配查找,所以会出现上面的编译错误。