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() 函数时,它运行正常。<<但是,当我使用 a调用运算符时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];

如您所见,其中包含 no <<,因此我不完全确定它指的是什么。


编辑:

从类中删除声明后,我将其在头文件中的条目替换为

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

除了您的语法错误1​​之外,operator<<其他类(在这种情况下)的重载ostream必须是非成员函数。将您的定义更改为

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

并从类中完全删除其声明,使其成为自由函数。


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

于 2011-11-23T02:27:54.170 回答