我正在将我的班级重建为模板,并且在cout重载时遇到了麻烦(无需模板即可工作)。我尝试编译时,gcc会引发此错误:
error: ‘LinkedList’ is not a type
ostream& operator <<(ostream&, LinkedList&);
LinkedList.h类的代码为:
template <typename value_type>
class LinkedList
{
public:
LinkedList();
~LinkedList();
void addToHead(const typename node<value_type>::value_type& entry);
void addToTail(const typename node<value_type>::value_type& entry);
void set_current(node<value_type>* entry);
void remove(string);
void remove_from_head();
void remove_from_tail();
void list_clear();
int list_length();
int count(string name);
double calcAverage();
bool search(string);
node<value_type> * get_head();
node<value_type> * get_tail();
node<value_type> * get_current();
LinkedList& operator+=(LinkedList&);
private:
node<value_type>* head;
node<value_type>* tail;
node<value_type>* current;
};
template <typename value_type>
ostream& operator <<(ostream&, LinkedList&);
我认为这与模板有关,并且代码的这一部分超出了类的范围,但是typedef的组合不同,似乎会导致更多错误。
答案 0 :(得分:7)
实际上LinkedList
不在这里,而是template
。
您可以通过实例化模板来创建类型,用模板替换其模板参数。
template <typename value_type>
ostream& operator <<(ostream&, const LinkedList<value_type>&);
编辑:如@Scheff所建议,列出的链接也应为const
,因为operator<<
永远都不要更改它。
答案 1 :(得分:2)
那是因为LinkedList
确实不是一种类型。 LinkedList<int>
或LinkedList<std::string>
是一种类型。 LinkedList<value_type>
是用于构建实际类型的类型模板。
您需要做的是指定模板参数,如下所示:
template <typename value_type>
ostream& operator <<(ostream&, LinkedList<value_type>&);