模板类运算符重载多个类型名 C++
Posted
技术标签:
【中文标题】模板类运算符重载多个类型名 C++【英文标题】:template class operator overloading multiple typenames C++ 【发布时间】:2019-01-06 09:29:42 【问题描述】:我在 surf.h 中有以下代码,其中声明了具有两种不同类型的模板类:
using namespace std;
template <typename T1, typename T2>
class surf;
template <typename T1, typename T2>
ostream & operator << (ostream & str, surf<T1,T2> & ov);
template <typename T1, typename T2>
class surf
public:
surf(T1 v1, T2 v2):
v1_(v1),
v2_(v2)
friend ostream & operator << <T1, T2> (ostream & str, surf<T1,T2> & ov);
T1 v1_;
T2 v2_;
;
template <typename T1, typename T2>
ostream & operator << (ostream & str, surf<T1,T2> & ov)
str << "("<<ov.v1_<<","<<ov.v2_<<")";
return str;
typedef surf<int,double> intSurf;
然后定义了一个新类,其中创建了一个类型为 T 的向量(在 field.h 中)
template<typename T>
class field;
template<typename T>
ostream & operator << (ostream & str, const field<T> & ov);
template<typename T>
class field
public:
field( int n, T val):
f_(n,val)
friend ostream & operator << <T> (ostream & str, const field<T> & ov);
protected:
vector<T> f_;
;
template<typename T>
ostream & operator << (ostream & str, const field<T> & ov)
for(auto &fE: ov.f_)
str << fE << endl;
return str;
typedef field<intSurf> surfField;
在 main.cpp 中我使用这个字段。
#include "field.h"
int main()
surfField a(4, intSurf(2,5));
cout<< a << endl;
return true;
我用g++(5.4版)编译它并得到以下错误:
在 main.cpp:2:0 包含的文件中: field.h:在“std::ostream& operator
我在做什么?
【问题讨论】:
【参考方案1】:您因为operator <<
的过载而丢失了const
template <typename T1, typename T2>
ostream & operator << (ostream & str, const surf<T1,T2> & ov);
// ^^^^^
//...
friend ostream & operator << <T1, T2> (ostream & str, const surf<T1,T2> & ov);
// ^^^^^
//...
template <typename T1, typename T2>
ostream & operator << (ostream & str, const surf<T1,T2> & ov)
// ^^^^^
//...
这个 const 是必需的,因为您试图显示来自 const field<T> & ov
的元素
【讨论】:
感谢您的帮助。实际上,这些行是代码的简化版本。我在原始代码中使用了 const,但仍然出现此错误(请参阅下一条评论) 我找到了主要问题。我在某些部分错过了友元方法的前向声明。我首先在 Windows 中使用 VC++ 编译了这段代码,现在将代码传输到 ubuntu。在 VC++ 中,编译器似乎隐含地考虑了这些前向声明,而我只是偶然错过了将其中一些放在头文件中。以上是关于模板类运算符重载多个类型名 C++的主要内容,如果未能解决你的问题,请参考以下文章