伙计们我正在尝试为我的类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;
};
答案 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是你的一个例子(完全编译,什么都不做)。