1

クラスSortedListのテンプレートを作成しようとしています。<< 演算子をオーバーロードしたいので、クラス内でフレンド関数を宣言しますが、main.cpp をコンパイルしようとするたびに次のエラーが発生します: template-id 'operator<< ... ' does not match anyテンプレート宣言。ここに main.cpp のコードがあります

int main()
{
    SortedList<int, int> lst, lst2;
    int a = 2;
    lst.addItem(2, 3);
    cout << lst << endl;
    return 0;
}

これはテンプレートクラスの宣言と定義です

template <typename K, typename V>
struct Node
{
    K key;
    V value;
    Node<K, V>* next;
};
template <typename K, typename V>
class SortedList
{
friend ostream& operator << <K, V>(ostream&, const SortedList&);
public:

    SortedList();
    SortedList(const SortedList&);
    SortedList& operator = (const SortedList&);
    ~SortedList();

    void addItem(const K&, const V&);
    void removeElem(const K&);
    void removeAt(int);
    bool remove(const K&);


private:

    Node<K, V>* start;
    size_t n;

};
4

1 に答える 1

2

C++ faqで適切な説明を見つけることができます。おそらく引用します。

コンパイラが適切なクラス定義でフレンド行を検出すると、思わぬ障害が発生します。その時点では、フレンド関数自体がテンプレートであることをまだ認識していません。

operator+ または operator<< 関数を呼び出すと、この仮定により、コンパイラは非テンプレート関数の呼び出しを生成しますが、実際にはこれらの非テンプレート関数を定義していないため、リンカーは「未定義の外部」エラーを返します。

1つの解決策は次のとおりです。

template<typename K, typename V> class SortedList;
template<typename K, typename V> std::ostream& operator<< (std::ostream& o, const SortedList<K,V>& x);

上に、クラスのを示します (完全にコンパイルされ、何もしません)。

于 2014-05-27T09:56:53.133 に答える