【问题标题】:template class operator overloading multiple typenames C++模板类运算符重载多个类型名 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

我在做什么?

【问题讨论】:

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


    【解决方案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++ 中,编译器似乎隐含地考虑了这些前向声明,而我只是偶然错过了将其中一些放在头文件中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 2013-02-05
    相关资源
    最近更新 更多