gpt4 book ai didi

c++ - 在模板类中将对象作为重载 operator+ 的参数传递

转载 作者:行者123 更新时间:2023-11-30 05:32:25 25 4
gpt4 key购买 nike

我试图将一个对象作为重载运算符+的参数传递(并且该类是模板类),但它给了我一个错误,指出:

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&)应该返回一个引用以允许运算符链接。它还通常采用常量引用以避免不必要的复制。

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;
}

关于c++ - 在模板类中将对象作为重载 operator+ 的参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35116365/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com