0

在 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

4

3 回答 3

4

因为Synonym不是全局范围内的名称。

要么使用

int PQL::Synonym::size() {
    return ids.size();
}

或在命名空间内实现该方法。

于 2013-02-22T13:59:09.093 回答
1

根据您的评论,我将其放在一起:您将所有内容放在一个 Cpp 文件中,并将该文件包含在不同的其他文件中。这些文件中的每一个都会编译,并且这些文件中的每一个都有一个PQL::Synonym::size(). 链接时,链接器会看到所有这些定义,但不知道选择哪一个。

将您的代码拆分为头文件和源文件,并将头文件包含在其他文件中。

于 2013-02-22T14:22:05.213 回答
1

这是因为您的代码位于头文件中并包含在多个编译单元中:

    inline int Synonym::size() {
//  ^^^^^^^
        return ids.size();
    }

添加 inline 告诉链接器可能有多个定义。

注意:关键字“内联”与现代编译器中的代码内联无关。

作为一个非常重要的说明。

您的头文件包含:

 using namespace std;
 // and
 using namespace PQL;

这是一个非常糟糕的主意。您现在正在对使用您的代码的任何人强制执行此操作。我永远不会使用您的头文件,因为它会污染我的代码并导致无法预料的问题。可以在您自己的源文件中执行此操作(当您知道并理解问题时),但您永远不应将其强加给其他开发人员。

请参阅:为什么“使用命名空间标准”被认为是不好的做法?

于 2013-02-22T16:42:29.113 回答