命名空间 - 一个容易被忽视的查找规则
2014-03-30 22:37
337 查看
示例代码:
上面的代码无法通过编译,错误如下:
'lx2::TestPoint' : ambiguous call to overloaded function
也就是,编译器无法确定在ShowPoint3D()函数中调用的是哪个TestPoint()。
在C++中有这样一个名字查找规则:如果在声明函数的参数时使用了一个雷,那么在查找匹配的函数名字时,编译器会在包含该参数类型的命名空间中也进行查找。
在上面的代码中,命名空间lx2中的TestPoint()函数参数是lx1::Point3D。按照上面的规则,编译器在查找匹配的函数时,也会去包含类Point3D的命名空间(也就是lx1)中进行匹配查找,所以会出现上面的编译错误。
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)中进行匹配查找,所以会出现上面的编译错误。
相关文章推荐
- C++中一个容易被忽视的名字查找规则
- C++中一个容易被忽视的名字查找规则
- C++中一个容易被忽视的名字查找规则
- 深入理解Python中命名空间的查找规则LEGB
- 深入理解Python中命名空间的查找规则LEGB
- 使用use语句来导入一个命名空间
- 多个 JS 文件共享一个命名空间
- 运营一个网站,新增加一个功能,容易忽视哪些问题就匆匆上线?
- 关于USART很多人都容易忽视的一个问题
- [FxCop.设计规则]10. 类型应该被声明在命名空间中
- 使用SQL Server Business Intelligence Development Studio 2005设计报表模型时的一个容易被忽视的问题
- 你所忽视的jQuery on事件 Event.namespace 添加命名空间
- 一个程序员的C#命名规则
- VS2015使用小技巧 如何知道一个类的命名空间
- XML 带命名空间查找节点
- SPORE,一个很好的实现JS命名空间的管理,模块的定义,与自动加载依赖模块的脚本文件
- 容易被忽视的一个Access关键字
- [FxCop.设计规则]10. 类型应该被声明在命名空间中
- PHP 5.3新特性命名空间规则解析及高级功能
- Zookeeper实例Curator API-使用curator来创建一个含隔离命名空间的ZooKeeper客户端