当前位置: 首页 > 知识库问答 >
问题:

重载多个类型的模板类运算符C++

米树
2023-03-14

我在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<<(std::ostream&,const field&)[with T=surf;std::ostream=std::basic_ostream]”的实例化中:main.cpp:9:9:需要从here field.h:36:7:错误:与“operator<<”(操作数类型为“std::ostream{又名std::basic_ostream}”和“const surf”)不匹配)str<

我在做什么?

共有1个答案

孟泽宇
2023-03-14

您的运算符<<重载缺少常量

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)
//                                    ^^^^^
//...

需要此常量,因为您试图显示来自常量字段 &ov 的元素

 类似资料:
  • 我在运算符过载时遇到问题 主要是我有 其中<code>Integer</code>只是<code>int</code>的包装,带有我需要的一些特殊功能。 然而,当我编译上面的代码时,我得到了错误C2679,它表示<code>binary' 我还试图删除友元声明中的参数,因此代码变成了: 但这会产生另一个错误:C2785:

  • 我正在为分数制作一个模板类,分子和分母可以是int、浮点数或双精度类型。当重载算术或关系运算符时,当我尝试添加两个类时,它会出现错误,比如A类和B类 在头文件“fraction. h”中 在cpp文件中 我期望它显示10.1/12.1,但是它给出编译器错误C2678,说二进制“”:没有找到接受“fraction”类型的左操作数的运算符(或者没有可接受的转换)。我花了很多时间试图解决这个问题,现在我

  • 我有一个模板类包含其他类的优先级队列,我需要使用优先级重载器调用各个类重载器,根据各个类的偏好进行比较(在这种情况下是年龄,在另一个类中可能是价格。 我绝对相信我已经实现了不正确的运算符重载,因此非常感谢您的建议。 举个例子 我得到这个错误,我不知道我需要做什么来修复它。我必须将类重载保持为单个变量(Animal) 任务cpp:在“布尔运算符”的实例化中

  • 在下面的代码中,是一个模板类,取决于非类型参数。为和定义了friend。还依赖于另一个bool模板参数。 在Coliru上看现场直播。 现在,我想给出的模板参数的默认值,例如,以便以下语句 相当于 如果我在 同样,它不编译给出错误 main.cpp:27:15:错误:重新声明friend'template std::ostream&operator<<(std::ostream&,const a&

  • 我对这个错误有意见 错误LNK2019未解析的外部符号"类std::basic_ostream 现在,< code>post所做的就是调用< code >操作符 宣言 定义 它们分别位于文件和中,我要求运算符不是成员函数(用于赋值)。

  • C++ 重载运算符和重载函数 类成员访问运算符( -> )可以被重载,但它较为麻烦。它被定义用于为一个类赋予"指针"行为。运算符 -> 必须是一个成员函数。如果使用了 -> 运算符,返回类型必须是指针或者是类的对象。 运算符 -> 通常与指针引用运算符 * 结合使用,用于实现"智能指针"的功能。这些指针是行为与正常指针相似的对象,唯一不同的是,当您通过指针访问对象时,它们会执行其他的任务。比如,当