1

这是我的代码:

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

所以,这是我的问题。我需要做什么才能完成这项工作?我试图以这个问题为例。

4

3 回答 3

2

operator<<被声明为成员函数。您需要改为使其成为自由函数,即在类之外定义它:

template <class T>
class list {
    // ...
};

template <class T>
ostream& operator<<(ostream &o, const list<T>& l) 
{
    // ...
};

如果你需要让你operator<<的班级成为朋友,那么请看看我对这个问题的回答

另外,我注意到您使用 ostreamwithout std::,这意味着您正在使用using namespace std.

如果您正在这样做,那么调用您的 class 是一个非常糟糕的主意list,因为将来任何时候都会将if添加到文件中,std::list从而将其拉入范围。using namespace std#include <list>

于 2012-11-20T01:14:32.323 回答
1

您可以尝试使 operator<< 成为朋友吗?

....;
friend ostream& operator<<(ostream &o, const list<T>& l) {
....;

这是因为如另一个问题所示,该函数必须声明为自由函数,如果声明为列表的成员,则仅在实际调用列表对象本身时才使用它。


编辑

@je4d 的好消息。

查看您的代码,您似乎不需要操作员成为朋友,因为我猜您将拥有头部和尾部的访问器。在类外部声明和定义它作为模板化的自由函数会更容易。

于 2012-11-20T01:13:07.910 回答
0

我最终使用了boost::lexical_cast<std::string>和建议的ostream& operator <<方法的组合。

于 2012-11-21T10:48:22.773 回答