Синтаксические ошибки при попытке перегрузки «<<»: слишком много параметров - PullRequest
1 голос
/ 23 ноября 2011

Я долго искал, и ближайший ответ был там

Переопределение 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();
}

1 Ответ

5 голосов
/ 23 ноября 2011

Помимо неправильного синтаксиса * перегрузки в других классах 1 , operator<< (в данном случае ostream) должны быть функциями, не являющимися членами.Измените ваше определение на

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

и полностью удалите его объявление из класса, чтобы оно было свободной функцией.

1 В случае, если вы хотите знать почему, бинарные операторы функции-члена принимают только один аргумент, потому что левая сторона является вызывающим объектом, доступ к которому осуществляется через this.Кроме того, вы забыли Table2D<T> до :: в определении.Но даже если вы их исправите, это не сработает так, как задумывалось, потому что, как было сказано ранее, перегрузка операторов в других классах должна выполняться через свободные функции.

...