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;

これは非常に悪い考えです。あなたは今、あなたのコードを使用する人にこれを強制しています. コードを汚染し、予期しない問題を引き起こす可能性があるため、ヘッダー ファイルは使用しません。自分のソース ファイルでこれを行うことは問題ありませんが (問題を認識して理解している場合)、他の開発者にこれを強制するべきではありません。

参照: 「名前空間 std の使用」が悪い習慣と見なされるのはなぜですか?

于 2013-02-22T16:42:29.113 に答える