将对象作为重载运算符+的参数传递给模板类

时间:2016-01-31 16:43:25

标签: c++ operator-overloading class-template

我正在尝试将一个对象作为重载运算符的参数传递+(并且该类是一个模板类),但它给出了一个错误,指出:

error C2955: 'Kvader': use of class template requires template argument list

这是我的班级:

template <class Q>
class Kvader {
private:
    Q a, b, c;
public:
    Kvader(const Kvader &temp);
    Kvader operator+(Kvader);
};

这是我的重载+方法:

template <class Q>
Kvader Kvader<Q>::operator+(Kvader<int> temp) {
a += temp.a;
b += temp.b;
c += temp.c;
return *this;
}

我以为

Kvader Kvader<Q>::operator+(Kvader<int> temp)

足以作为参数列表。我做错了什么?

在我的主要内容中我只创建了2个对象,(第二个调用了复制构造函数),然后我尝试将它们组合在一起。

int main(){
Kvader<int> object1, object2(object1);
object1 = object1 + object2;

return 0;
}

1 个答案:

答案 0 :(得分:1)

此代码包含一些错误:

1)Kvader<Q> Kvader<Q>::operator+(Kvader<int> temp)

您还需要为返回类型指定参数列表。

2)Kvader<Q> operator+(Kvader<int>);

与1相同)+将参数类型更改为Kvader<int>而不是通用Kvader<Q>

3)Kvader<Q>(const Kvader<Q> &temp);

与1)相同。

4)为Kvader<Q>指定默认构造函数,否则main()中的创建语句将失败。

5)此外,operator+(const T&)应返回允许操作员链接的引用。它通常还需要一个const引用来避免不必要的复制。

6)最后,除非你有特别的理由按照你已经完成的方式去做,所以operator+(const Kvader<Q>&)之类的东西应该先用通用的方式来定义,然后在有了需要这样做。按照您编写的方式,operator+(cont Kvader<int>&)仅适用于Q对象this类型可添加到int的类型。您可能希望实现的目的是启用Kvader的特化,并将任何特定参数添加到Kvader并使用相同的确切参数。然后,您可以为特定Q类型创建专精,例如int

我建议你真正阅读课程和功能模板!实际上,它们有时会令人困惑。

完整代码:

template <class Q>
class Kvader {
private:
    Q a, b, c;
public:
    Kvader() {}
    Kvader(const Kvader<Q> &temp);
    Kvader& operator+(const Kvader<Q>& temp);
};

template <class Q>
Kvader<Q>& Kvader<Q>::operator+(const Kvader<Q>& temp) {
a += temp.a;
b += temp.b;
c += temp.c;
return *this;
}

template<class Q>
Kvader<Q>::Kvader(const Kvader<Q> &temp)
{}

int main(){
Kvader<int> object1, object2(object1);
object1 = object1 + object2;

return 0;
}