[英]C++ Function already defined?
在cpp文件的顶部,我有
namespace PQL {
class Synonym {
...
public:
...
int size();
};
}
// removing the below chunk makes it work
int Synonym::size() {
return ids.size();
}
为什么最底层的代码会使代码失败? 我正在创建函数的执行? 其他功能定义了类似的工作方式。
更新 :
我得到的错误看起来像:
Error 1 error LNK2005: "public: int __thiscall PQL::Synonym::size(void)" (?size@Synonym@PQL@@QAEHXZ) already defined in main.obj H:\\Dropbox\\Sch\\CS3202\\SPA_CPP\\SPA\\pql.obj
因为Synonym
不是全局范围内的名称。
无论使用
int PQL::Synonym::size() {
return ids.size();
}
或在命名空间内实现方法。
根据您的评论,我将其组合在一起:您将所有内容都放在一个Cpp文件中,并将该文件包含在其他文件中。 这些文件中的每个文件都进行编译,并且每个文件都具有PQL::Synonym::size()
。 链接时,链接器会看到所有这些定义,并且不知道选择哪个定义。
将代码分为头文件和源文件,仅将头文件包含在其他文件中。
这是因为您的代码在头文件中,并且包含在多个编译单元中:
inline int Synonym::size() {
// ^^^^^^^
return ids.size();
}
添加内联告诉链接器可能有多个定义。
注意:关键字“ inline”与现代编译器中的代码内联无关。
您的头文件包含:
using namespace std;
// and
using namespace PQL;
这是一个非常糟糕的主意。 现在,您将对所有使用您的代码的人强制执行此操作。 我永远不会使用您的头文件,因为它会污染我的代码并导致无法预料的问题。 可以在自己的源文件中进行此操作(当您了解并理解这些问题时),但是绝对不要强加于其他开发人员。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.