0

ここの例のように、5 つのファイルがあります - Dec.h、Dec.cpp、decInterface.h、decInterface.cpp、および temp.c

cでc ++オブジェクトを使用するには? インターフェイス ファイルの助けを借りて Dec.cpp に実装された cpp コードを呼び出す temp.c と呼ばれるファイルのメインを使用して、オブジェクト指向 C++ コード用の C ラッパー API を開発 し ます。

それらはすべて vs2008 の 1 つのプロジェクトに存在します。C としてコンパイルまたは C++ としてコンパイルする代わりに、オプションとしてコンパイルをデフォルトに設定しました。

次のリンク エラーが表示されます

    1>Compiling...
    1>decInterface.cpp
    1>Generating Code...
    1>Compiling...
    1>temp.c
    1>Generating Code...
    1>Compiling manifest to resources...
    1>Microsoft (R) Windows (R) Resource Compiler Version 6.0.5724.0
    1>Copyright (C) Microsoft Corporation.  All rights reserved.
    1>Linking...

        1>decInterface.obj : error LNK2005: "public: __thiscall Node::Node(class std::vector<float,class std::allocator<float> >)" (??0Node@@QAE@V?$vector@MV?$allocator@M@std@@@std@@@Z) already defined in Dec.obj
        1>decInterface.obj : error LNK2005: "public: __thiscall Node::Node(float,float)" (??0Node@@QAE@MM@Z) already defined in Dec.obj
        1>decInterface.obj : error LNK2005: "public: __thiscall Node::Node(class std::vector<float,class std::allocator<float> >,class std::vector<bool,class std::allocator<bool> >)" (??0Node@@QAE@V?$vector@MV?$allocator@M@std@@@std@@V?$vector@_NV?$allocator@_N@std@@@2@@Z) already defined in Dec.obj
        1>decInterface.obj : error LNK2005: "public: __thiscall reprVectorsTree::reprVectorsTree(class std::vector<class Node *,class std::allocator<class Node *> >,int)" (??0reprVectorsTree@@QAE@V?$vector@PAVNode@@V?$allocator@PAVNode@@@std@@@std@@H@Z) already defined in Dec.obj
        1>decInterface.obj : error LNK2005: "public: __thiscall reprVectorsT

ree::reprVectorsTree(float * *,int,int)" (??0reprVectorsTree@@QAE@PAPAMHH@Z) already defined in Dec.obj
    1>decInterface.obj : error LNK2005: "private: class std::vector<bool,class std::allocator<bool> > __thiscall reprVectorsTree::binaryForm(int,int)" (?binaryForm@reprVectorsTree@@AAE?AV?$vector@_NV?$allocator@_N@std@@@std@@HH@Z) already defined in Dec.obj
    1>decInterface.obj : error LNK2005: "public: class std::vector<float,class std::allocator<float> > __thiscall reprVectorsTree::decode(class std::vector<bool,class std::allocator<bool> >)" (?decode@reprVectorsTree@@QAE?AV?$vector@MV?$allocator@M@std@@@std@@V?$vector@_NV?$allocator@_N@std@@@3@@Z) already defined in Dec.obj
    1>decInterface.obj : error LNK2005: "public: float * __thiscall reprVectorsTree::decode(int *,int)" (?decode@reprVe

ctorsTree@@QAEPAMPAHH@Z) already defined in Dec.obj

どの種類の Visual Studio プロジェクト設定を使用する必要がありますか? 問題はここにあると思いますか?どのファイルをリンクしますか? リンクするには?またはデフォルトのプロジェクト設定が機能するはずですか?

4

1 に答える 1

1

エラー メッセージは、いくつかの関数が と の両方、または両方のソース ファイルに含まれるヘッダーで定義されていることを示していDec.cppますdecInterface.cpp。通常、プログラム内の関数の定義は 1 つしか許可されていません。これは、One Definition Rule (の 1 つの側面)です。

定義が両方のソース ファイルにある場合は、どちらか一方から削除します。

それらがヘッダーにある場合は、選択肢があります。ヘッダーに宣言だけを残して、定義を 1 つの (そして 1 つだけの) ソース ファイルに移動できます。

// header
class Node {
public:
    Node(std::vector<float>); // declaration
};

// source
Node::Node(std::vector<float>) {
    // definition
}

inlineまたは、ヘッダーでそれらを定義することもできます。これにより、ルールが緩和され、複数の同一の定義が許可されます。

// header
class Node {
public:
    Node(std::vector<float>); // declaration
};

inline Node::Node(std::vector<float>) {
    // inline definition
}

または、クラス定義内で定義することもできます。これにより、インラインにもなります。

// header
class Node {
public:
    Node(std::vector<float>) {
        // inline definition
    }
};
于 2012-08-17T07:32:37.827 に答える