1

我正在尝试将对象作为重载 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;
}
4

1 回答 1

1

此代码包含一些错误:

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

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

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

与 1) 相同 + 将参数类型更改为Kvader<int>而不是 generic 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具有相同确切参数的 's 中。然后,您可以为特定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;
}
于 2016-01-31T16:53:09.543 回答