1

私はしばらく探していましたが、答えに最も近いものはあそこにありました

C++でのtoStringオーバーライド

しかし、クラスでそれを機能させることができませんでした。

私はTable2D.hこれを含むを持っています:

std::string toString() const;
std::ostream & operator<<( std::ostream & o, const Table2D<T> & s );

そして私はこれを含むテンプレートクラスを持ってTable2D.templateいます:

template <class T>
std::ostream & :: operator<<( std::ostream & o, const Table2D<T> & s ){
    return out << s.toString();
}

mainからtoString()関数を呼び出すと、正しく機能します。<<ただし、を使用してオペレーターを呼び出すとstd::cout、次のエラーが発生します。

Table2D.h(59): error C2804: binary 'operator <<' has too many parameters
Table2D.h(85) : see reference to class template instantiation 'Table2D<T>' being compiled
Table2D.template(100): error C2039: '<<' : is not a member of '`global namespace''
Table2D.h(59): error C2804: binary 'operator <<' has too many parameters

59行目に含まれていることがわかります

for (unsigned y=0; y<m_height; y++) col_ptr[y] = (T) col_ptr_src[y];

ご覧のとおり、これには'が含まれていない<<ため、何を指しているのか完全にはわかりません。


編集:

クラスから宣言を削除した後、ヘッダーファイルのエントリを次のように置き換えました

template <class T>
std::ostream& operator<<( std::ostream& o, const Table2D<T>& s ) {
    return o << s.toString();
}

次のエラーが発生しました:

Table2D.h(60): error C2804: binary 'operator <<' has too many parameters
Table2D.h(89) : see reference to class template instantiation 'Table2D<T>' being compiled

テンプレートファイルの89行目にはstd::stringstream resultStream;

これは私のtoString関数の最初の行で、次のようになります

template <class T>
std::string Table2D<T> :: toString() const{
    std::stringstream resultStream;
    for(unsigned i = 0; i< m_height; i++){
        for (unsigned j = 0; j < m_width; j++){
            resultStream << (*this)[i][j] << "\t";
        }
        resultStream << endl;
    }
    return resultStream.str();
}
4

1 に答える 1

5

構文が間違っていることを除けば1operator<<他のクラス(ostreamこの場合)のオーバーロードは非メンバー関数でなければなりません。定義を次のように変更します

template <class T>
std::ostream& operator<<( std::ostream& o, const Table2D<T>& s ) {
    return o << s.toString();
}

そして、その宣言をクラスから完全に削除して、それが自由な関数になるようにします。


1理由を知りたい場合は、左側が。を介してアクセスされる呼び出し元オブジェクトであるため、メンバー関数の二項演算子は1つの引数のみを取りますthis。また、定義のTable2D<T>前を忘れました。::ただし、これらを修正しても、前述のように、他のクラスでの演算子のオーバーロードは無料の関数を介して実行する必要があるため、意図したとおりに機能しません。

于 2011-11-23T02:27:54.170 に答える