Я долго искал, и ближайший ответ был там
Переопределение toString в C ++
Однако я не смог сделатьэто работает в моем классе.
У меня есть 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();
}
когда я вызываю свою функцию toString () из main, она работает правильно.Однако когда я вызываю оператор <<
, используя 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();
}