c++ - 模板类运算符重载多个类型名 C++

标签 c++ c++11 templates g++ operator-overloading

我在 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 的 vector (在 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<<(std::ostream&, const field&) [with T = surf; std::ostream = std::basic_ostream]’: main.cpp:9:9: 从这里需要 field.h:36:7: 错误:“operator<<”不匹配(操作数类型为“std::ostream {aka std::basic_ostream}”和“const surf”) str << fE << endl;

我在做什么?

最佳答案

你错过了一个 const因为你重载了operator <<

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 field<T> & ov 的元素

关于c++ - 模板类运算符重载多个类型名 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51588740/

相关文章:

c++ - "candidate template ignored: substitution failure:"编译错误?

c++ - OpenCV 中的点问题

c++组合来自两个(或更多)参数包的值

templates - 将 Sitecore 模板字段源值设置为动态 Sitecore 查询

c++ - 抛出不能正常工作

c++ - 为什么使用迭代器而不是数组索引?

c++ - 从 .tmx (Tiled) 文件解压缩 zlib 数据

c++ - 为什么在 C++11/C++14 中有针对自动和大括号初始化器的特殊类型推导规则?

C++11:std ref 全局变量和非函数局部 thread_local 初始化顺序?

c++ - 通过完美转发将可变参数模板参数作为对 std::thread 的引用传递