我正在尝试将一个对象作为重载运算符的参数传递+(并且该类是一个模板类),但它给出了一个错误,指出:
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;
}
答案 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;
}