这是我的代码:
template<typename T>
class list {
private:
node<T>* head;
node<T>* tail;
int len;
public:
list(){
this->len = 0;
this->head = this->tail = 0;
}
~list(){
node<T>* n = this->head;
if (!n) return;
node<T>* t = NULL;
while (n){
t = n->next;
delete n;
n = t;
}
}
/* other stuff */
ostream& operator<<(ostream &o, const list<T>& l) {
node<T>* t = l.head;
while (t){
strm << *(t->value);
if (!t->next) break;
strm << ", ";
t = t->next;
}
return strm;
}
};
我收到以下编译错误:
rm bin *.o -f
g++ -g -Wall main.cpp -o bin
main.cpp:110: error: 'std::ostream& list<T>::operator<<(std::ostream&, const list<T>&)' must take exactly one argumentmain.cpp: In function 'int main(int, char**)':
main.cpp:151: error: no match for 'operator<<' in 'std::cout << l'
/usr/include/c++/4.4/ostream:108: note: candidates are: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>& (*)(std::basic_ostream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
... other errors
make: *** [main] Error 1
所以,这是我的问题。我需要做些什么来完成这项工作?我试图以this question为例。
答案 0 :(得分:2)
您的operator<<
被声明为成员函数。你需要让它成为一个自由函数,即在类外定义它:
template <class T>
class list {
// ...
};
template <class T>
ostream& operator<<(ostream &o, const list<T>& l)
{
// ...
};
如果您需要让operator<<
成为班上的朋友,那么请查看我对this question
此外,我注意到您使用的ostream
没有std::
,这意味着您正在使用using namespace std
。
如果你这样做,那么打电话给你的班级list
是一个非常糟糕的主意,因为如果{std::list
有using namespace std
,#include <list>
会被{{1}}拉入范围1}}将来会随时添加到文件中。
答案 1 :(得分:1)
你可以试着让运营商&lt;&lt;作为朋友?
....;
friend ostream& operator<<(ostream &o, const list<T>& l) {
....;
这是因为如另一个问题所示,这个函数必须声明为自由函数,如果声明为list的成员,只有在列表对象本身实际调用它时才使用它。
@ je4d很好的捕获。
查看你的代码看起来你不需要操作员成为朋友,因为我猜测你将拥有头部和尾部的访问器。在类之外声明和定义它作为模板化的自由函数会更容易。
答案 2 :(得分:0)
我最终使用了boost::lexical_cast<std::string>
和建议的ostream& operator <<
方法的组合。