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