在模板中将对象作为重载 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;
}