在模板中将对象作为重载 operator+ 的参数传递 class
Passing an object as a parameter of an overloaded operator+ in a template class
我试图将一个对象作为重载运算符+的参数传递(并且 class 是一个模板 class),但它给我一个错误,指出:
error C2955: 'Kvader': use of class template requires template argument list
这是我的 class:
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)
您还需要为 return 类型指定参数列表。
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&)
应该 return 引用以允许运算符链接。它还通常采用 const 引用来避免不必要的复制。
6) 最后,除非你有特别的理由按照你的方式去做,像 operator+(const Kvader<Q>&)
这样的东西应该首先以通用的方式定义,然后再专门化,当有需要这样做。按照您编写的方式,operator+(cont Kvader<int>&)
仅适用于可以将 this
对象的 Q
类型添加到 int
的那些类型。您可能想要实现的是启用具有任何特定参数的 Kvader
的特化,以将其添加到具有相同确切参数的 Kvader
。然后,您可以为特定的 Q
类型创建特化,例如 int
.
我建议您实际阅读 class 和函数模板!确实,它们有时会令人困惑。
完整代码:
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;
}
我试图将一个对象作为重载运算符+的参数传递(并且 class 是一个模板 class),但它给我一个错误,指出:
error C2955: 'Kvader': use of class template requires template argument list
这是我的 class:
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)
您还需要为 return 类型指定参数列表。
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&)
应该 return 引用以允许运算符链接。它还通常采用 const 引用来避免不必要的复制。
6) 最后,除非你有特别的理由按照你的方式去做,像 operator+(const Kvader<Q>&)
这样的东西应该首先以通用的方式定义,然后再专门化,当有需要这样做。按照您编写的方式,operator+(cont Kvader<int>&)
仅适用于可以将 this
对象的 Q
类型添加到 int
的那些类型。您可能想要实现的是启用具有任何特定参数的 Kvader
的特化,以将其添加到具有相同确切参数的 Kvader
。然后,您可以为特定的 Q
类型创建特化,例如 int
.
我建议您实际阅读 class 和函数模板!确实,它们有时会令人困惑。
完整代码:
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;
}