尝试重载时语法错误 "<<" :参数太多

Syntax errors when trying to overload "<<": too many parameters

本文关键字:lt 参数 太多 重载 错误 语法      更新时间:2023-10-16

我已经找了一段时间,最接近答案的东西在那里

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();
}

当我从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();
}

除了语法错误1之外,operator<<重载其他类(本例中为ostream)必须是非成员函数。将定义更改为

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

,并将其声明从类中完全移除,使其成为一个自由函数。


1如果你想知道为什么,成员函数二元操作符只接受一个参数,因为左边是调用对象,通过this访问。另外,您在定义中忘记了::之前的Table2D<T>。但是,即使您修复了这些问题,它也不会像预期的那样工作,因为如前所述,其他类的操作符重载必须通过自由函数完成。