私はしばらく探していましたが、答えに最も近いものはあそこにありました
しかし、クラスでそれを機能させることができませんでした。
私は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();
}