您的位置:首页 > 其它

命名空间 - 一个容易被忽视的查找规则

2014-03-30 22:37 337 查看
示例代码:

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)中进行匹配查找,所以会出现上面的编译错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  namespace 查找规则