创建友元模板函数时出现意外错误

Unexpected error when creating a friend template function

本文关键字:意外 错误 函数 友元 创建      更新时间:2023-10-16

家伙我正试图为我的类SortedList创建一个模板。我想重载<<操作符,所以我在类中声明了一个友元函数,但每次我试图编译main.cpp时,我都会得到以下错误:模板id的operator<& lt;…'不匹配任何模板声明。下面是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;
};

你可以在c++常见问题解答中找到一个很好的解释,也许我将引用它:

当编译器在类定义正确。那一刻它还不知道友元函数本身就是模板。

调用操作符+时或operator<& lt;函数,此假设导致编译器生成对非模板函数的调用,但链接器会这样做给你一个"未定义的外部"错误,因为你从来没有定义了那些非模板函数

一个解决方案是:

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

在最上面,这是你的类的一个例子(编译完美,只是什么都不做)