模板类运算符重载多个类型名 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 &lt;&lt; 的过载而丢失了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&lt;T&gt; &amp; ov 的元素

【讨论】:

感谢您的帮助。实际上,这些行是代码的简化版本。我在原始代码中使用了 const,但仍然出现此错误(请参阅下一条评论) 我找到了主要问题。我在某些部分错过了友元方法的前向声明。我首先在 Windows 中使用 VC++ 编译了这段代码,现在将代码传输到 ubuntu。在 VC++ 中,编译器似乎隐含地考虑了这些前向声明,而我只是偶然错过了将其中一些放在头文件中。

以上是关于模板类运算符重载多个类型名 C++的主要内容,如果未能解决你的问题,请参考以下文章

尝试在模板类中重载 / 运算符的 C++ 错误

使用 C++ 概念重载不同模板类型的运算符

C++运算符重载

模板化一个类,然后重载运算符 (C++)

重载 [] 和 = 运算符以在 C++ 中接受我的模板类的值

如何为从C++中的模板继承的类重载赋值运算符