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<<に対する私の回答をご覧ください

また、あなたが を ostream使わずstd::に を使っていることに気付きました。つまり、 を使っているということですusing namespace std

あなたがそれをしているなら、あなたの class を呼び出すのは本当に悪い考えです. listifによって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 に答える