创建好友模板功能时出现意外错误

时间:2014-05-27 09:34:17

标签: c++ class templates operator-overloading friend-function

伙计们我正在尝试为我的类SortedList创建一个模板。我想重载<<运算符,所以我在类中声明了一个友元函数,但每次我尝试编译main.cpp时都会出现以下错误:  template-id'运算符<< ...'与任何模板声明都不匹配。 这里是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;

};

1 个答案:

答案 0 :(得分:2)

你可以在C++ faq找到一个很好的解释,也许我会引用它:

  

当编译器看到朋友行在中时,会发生阻塞   类定义合适。那时它还不知道   朋友的功能本身就是模板。

     

当您致电运营商+时   或运算符&lt;&lt;函数,这个假设导致编译器   生成对非模板函数的调用,但链接器将   给你一个“未定义的外部”错误,因为你从来没有   定义了那些非模板函数。

一个解决方案是:

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

最重要的是,Here是你的一个例子(完全编译,什么都不做)。