我一直在寻找一段时间,最接近答案的是
但是我无法在班上工作。
我有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();
}
答案 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>
之前的::
。但即使你修复了它们也无法正常工作,因为如前所述,其他类的运算符重载必须通过自由函数完成。