zoukankan      html  css  js  c++  java
  • 一次简单的C++编译错误

    快要下班的时候,开发部的一名小鲜肉找我帮忙解决一个问题:

       才哥,我们提供给计费组的库在计费主机上编译报错了,但是提供给其他组用时没有编译报错。计费也不认,说编译器报的是我们代码上的错误,要我解决,帮我看看呢,这是报错信息:

    pbobject.h:129: error: reference to 'Message' is ambiguous
    message.h:169: error: candidates are: class google::protobuf::Message
    Message.h:28: error:                 class Bmco::Message
    pbobject.h:129: error: reference to 'Message' is ambiguous
    message.h:169: error: candidates are: class google::protobuf::Message
    Message.h:28: error:                 class Bmco::Message
    pbobject.h:129: error: 'Message' has not been declared 

          

    我一看是模糊定义,是二义性问题,大概有了谱。

    最开始的想法是找到编译报错的cpp文件,使用g++ -E选项把编译转换单元展开看看到底是哪里重复定义了。但是由于计费组的make输出太复杂太长,看不出来。于是直接在计费的代码目录下使用find命令全文搜索了“class Message”,发现果真有一个类定义。但是有一个问题是开发部这边使用的protocol buffer下面的Message应该是要用名字空间“google::protobuf”  来限定访问,不应该有这样的问题,于是查看了开发部提供的.h文件 赫然有一个“using namespace google::protobuf”,于是谜底揭开了,还是开发部这边提供的头文件问题,为什么其他组没有遇到问题?那是运气好,别人没有定义全局的Message类。

    解决办法就是让开发部的小鲜肉把头文件的using namespace google::protobuf去掉,把所有函数参数,对象,指针定义Message的地方通过显示的名字空间访问。

    总的来说还是开发部的代码不规范,既然是要提供库给其他模块,那么首先就应该定义一个属于开发部这边的名字空间,所有要提供出去的名称都在这个名字空间下来声明。  名字空间就是专门来解决这种问题的,这种错误不应该犯。

  • 相关阅读:
    基于屏幕的可用区域
    Legacy Browser/Windows/Office Support
    getBoundingClientRect 和 getClientRect
    基础健康知识——12.自限性疾病
    基础健康知识——11.弊病
    基础健康知识系列
    基础健康知识——常见疾病:腹泻
    基础健康知识——常见疾病:感冒
    基础健康知识——10.就医
    基础健康知识——9.反复感染
  • 原文地址:https://www.cnblogs.com/manziluo/p/5787661.html
Copyright © 2011-2022 走看看