0

私は自分のプログラムを書きましたが、ヘッダー ファイルにすべてを保持し、メインを作成すると機能します。現在、それらを実装ファイルに分割していますが、Eclipse でエラーが発生し続けます。コンストラクターと関数の開き中かっこごとにエラーが発生します。それらのすべてに、「(コンストラクターまたはメソッドの名前)の再定義、以前にここで宣言されました」と書かれています。ヘッダーファイルで機能するため、何が間違っていますか?

#include "KeyValuePair.h"

template<typename Key,typename Value>
KeyValuePair<Key,Value>::KeyValuePair()
{ // error here
}

template<typename Key,typename Value>
void KeyValuePair<Key,Value>::setPair(Key key, Value value)
{ // error here
    pairKey = key;
    pairValue = value;
}

template<typename Key,typename Value>
Key KeyValuePair<Key,Value>::getKey() const
{ // error here
    return pairKey;
}

template<typename Key,typename Value>
Value KeyValuePair<Key,Value>::getValue() const
{ // error here
    return pairValue;
}

ヘッダー ファイル:

#ifndef _KEYVALUEPAIR_H_
#define _KEYVALUEPAIR_H_

template<typename Key,typename Value>
class KeyValuePair
{
    private:
        Key pairKey;
        Value pairValue;

    public:
        KeyValuePair();
        void setPair(Key key,Value value);
        Key getKey() const;
        Value getValue() const;
};



#include "KeyValuePair.cpp"
#endif
4

2 に答える 2

2

現状では、KeyValuePair.h ファイル#include KeyValuePair.cppの下部に があります。KeyValuePair.cpp には、ヘッダー ファイルも #include されています。ヘッダー ファイルには通常の「ガード」 (#ifndef _KEYVALUEPAIR_H_) があり、複数回インクルードされるのを防ぎますが、CPP ファイルにはありません。したがって、CPP ファイルをコンパイルしようとすると、H ファイルが取り込まれ、H ファイルが再び CPP ファイルを取り込みます。したがって、複数定義エラーです。

最も簡単な解決策ですが、必ずしも最も正しいとは限りませんが#include "KeyValuePair.h"、KeyValueHeader.cpp ファイルの先頭から行を削除することです。

Makefile 内で KeyValuePair.cpp を実際にコンパイルしようとしていると思われますが、これは行う必要はありません (また、行うべきではありません)。テンプレートクラスを必要とするソースファイルが必要なだけです#include "KeyValuePair.h"

テンプレートの標準的な方法は、宣言と実装を同じヘッダー ファイルに保持することです。これにより、この種の問題が暗黙のうちに回避されます。テンプレート クラス メソッドの実装がテンプレート クラス宣言内にインライン化され、すべてが 1 つのヘッダー ファイルに含まれていることは珍しくありません。インターフェイスの実装からの分離について学んだことはすべて台無しになりますが、操作は簡単です。

于 2013-02-10T03:11:29.700 に答える
1

テンプレートはオンデマンドでコンパイルされるため、テンプレートのすべてのコードをヘッダー ファイルに配置する必要があります。

テンプレートのドキュメントを参照してください。

于 2013-02-10T03:08:24.443 に答える