现在,有下面的代码:
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 << "Output from lx1::TestPoint()." << endl;
}
}
namespace lx2
{
void TestPoint(const lx1::Point3d &pt)
{
cout << "Output from 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()函数。
也许你会非常不解,为什么会出现这样的编译错误。在命名空间lx2中只有一个函数TestPoint(),为什么编译器会不能确定调用哪个TestPoint()函数呢?虽然在命名空间lx1中有一个跟lx2中参数列表相同的TestPoint()函数,可是在命名空间lx2中并没有用using namespace lx1;这样的语句,编译器应该不会去命名空间lx1中去匹配TestPoint()函数呀。
事实上,出现编译错误的原因就是在命名空间lx1和lx2里面都有一个函数列表相同的TestPoint()函数。
在C++中有这样一个名字查找规则--如果在声明函数的参数时使用了一个类,那么在查找匹配的函数名字时,编译器会在包含参数类型的名字空间中也进行查找。
在上面的代码中,命名空间lx2中的TestPoint()函数参数是lx1::Point3d。按照上面的规则,编译器在查找匹配的函数名字时,也会去包含参数Point3d的名字空间(也就是lx1)中进行匹配查找。而在命名空间lx1中也有一个参数列表跟命名空间lx2中一样的TestPoint()函数,所以会出现上面的编译错误。
这是C++中一条非常容易被忽视的名字查找规则,因此要格外重视。 

C++中一个容易被忽视的名字查找规则相关推荐

  1. c++类名字查找与类的作用域

    一.总纲 二.用于类成员声明的名字查找 三.成员定义中的普通块作用域的名字查找 类内作用域使用自己的成员变量,可以使用作用域运算符::或者this两种方法(什么也不加隐式是第二种的缩写). 三.如果编 ...

  2. C++中一个名字查找的小知识

    最近看C++标准中的3.4 name lookup章节,碰巧的是stackoverflow也有人提问,他们对这个问题很疑惑,回答的也并不好. https://stackoverflow.com/que ...

  3. 王者荣耀中一个英雄是怎么被产生的?

    点击关注公众号,Java干货及时送达 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接: https://blog.csdn.net/ ...

  4. Java中一个令人惊讶的bug

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 今天分享一个JDK中令人惊讶的BUG,这个BUG的神奇之处在于,复 ...

  5. Throwable是java.lang包中一个专门用来处理异常的类

    答:Throwable是java.lang包中一个专门用来处理异常的类.它有两个子类,即Error 和Exception,它们分别用来处理两组异常. Error用来处理程序运行环境方面的异常,比如,虚 ...

  6. html语言中,定义文档中一个正在打开的链接的颜色的代码是,2017微软认证考试精选练习(附答案)...

    2017微软认证考试精选练习(附答案) 1.如果要使图像在缩放时不失真,在图像显示原始大小时,按下( )键,拖动 图像右下方 的控制点,可以按比例调整图像大小 B A. Ctrl B. Shift C ...

  7. Django中一个项目使用多个数据库(原生sql 的使用,亲测)

    在django项目中, 一个工程中存在多个APP应用很常见. 有时候希望不同的APP连接不同的数据库,这个时候需要建立多个数据库连接. 参考:http://blog.csdn.net/songfree ...

  8. 随记:Linux中一个修改活动卷组名所引发的血案

    今天无意中看到之前的卷组名字有点不太顺眼,随手一个vgrename就给改了,结果直接导致了服务器重启后无法正常引导 先分析原因吧,我只有一个VG,除了boot下挂的正常分区,其余的分区类型都是lvm, ...

  9. for循环中一个不容小觑的问题

    for(int i=1;i<=100;i++) 作为程序猿,我们很喜欢使用这种for循环. 可是,当中隐含着一个重要的问题. 过多的编程经历可能使我们的思维产生了一些误解,在上面的for循环中, ...

最新文章

  1. 用树莓派从0开始打造属于自己的服务器
  2. VUE项目中使用this.$forceUpdate();解决页面v-for中修改item属性值后页面v-if不改变的问题
  3. 联发科首发台积电4nm,新旗舰多核跑分与苹果A15不相上下,网友:MTK也要Yes了?...
  4. 确定关键质量的5大原则
  5. hbase中清空整张表的数据
  6. Redis-6.2.5 安装 Linux环境(单机)
  7. git灰度发布版本_spring cloud灰度发布
  8. 网站性能优化小结和spring整合redis
  9. request,response,session
  10. python 文件批量转换格式_python实现快速文件格式批量转换的方法
  11. 使用canvas制作在线涂鸦画板
  12. POJ1008:玛雅日历
  13. 计算机网络压线实验,实验一双绞线的制作山东大学计算机网络自考作业
  14. Android开源的社交应用
  15. element-plus icon图标的正确使用姿势
  16. mnist 数据集 下载 训练 测试 pytorch
  17. ubuntu软件安装在哪里/安装位置
  18. tradingView--K线图 使用
  19. CasperLabs携手SJM集团共同推动Web3在阿联酋应用落地
  20. Defi+房地产=房地产未来

热门文章

  1. linux查看占用的命令,linux内存占用查看命令
  2. Linux下的find的使用方法
  3. android 菱形布局,Android 设计一个菱形形状的Imageview组件.
  4. python用户注册(基于django)
  5. 记一次使用快速幂与Miller-Rabin的大素数生成算法
  6. storm流式大数据处理流行吗
  7. Linq TO SQL 虽好,但不要滥用
  8. 高通平台modem部分mbn文件的OTA和PDC升级方法
  9. WinCE NAND flash - FAL
  10. jdbc mysql 自动重连_JDBC实现Mysql自动重连机制的方法详解