尝试重载时的语法错误"<<&#;;参数太多了

时间:2011-11-23 02:24:39

标签: c++ ostream

我一直在寻找一段时间,最接近答案的是

toString override in 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 个答案:

答案 0 :(得分: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>之前的::。但即使你修复了它们也无法正常工作,因为如前所述,其他类的运算符重载必须通过自由函数完成。