尝试重载时语法错误 "<<" :参数太多
Syntax errors when trying to overload "<<": too many parameters
我已经找了一段时间,最接近答案的东西在那里
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>
。但是,即使您修复了这些问题,它也不会像预期的那样工作,因为如前所述,其他类的操作符重载必须通过自由函数完成。
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何使用Luacneneneba API正确读取字符串和表参数
- 在派生函数中指定void*参数
- 视图中的参数推导失败:take_while
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 左角支架解释为操作员&lt;而不是模板参数
- 重载运算符<<:此运算符函数的参数太多
- 重载<<运算符错误C2804:二进制'运算符<<'参数太多