【问题标题】:Passing an object as a parameter of an overloaded operator+ in a template class在模板类中将对象作为重载 operator+ 的参数传递
【发布时间】:2016-01-31 16:43:24
【问题描述】:

我试图将一个对象作为重载 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)

作为参数列表就足够了。我做错了什么?

在我的 main 中,我只创建了 2 个对象(第二个调用了复制构造函数),然后我尝试将它们添加在一起。

int main(){
Kvader<int> object1, object2(object1);
object1 = object1 + object2;

return 0;
}

【问题讨论】:

  • 返回类型中需要一个模板参数。作为猜测,Kvader&lt;Q&gt; Kvader&lt;Q&gt;::operator+(Kvader&lt;int&gt; temp) ...
  • operator+ 中的参数应该是 const&amp; 并且它的返回类型应该是这样的引用:Kvader&lt;Q&gt;&amp; Kvader&lt;Q&gt;::operator+(const Kvader&lt;Q&gt;&amp; temp)。此外,您还可以混合专业化(针对ints)和定义模板。
  • @Patryk operator += 应该返回一个引用,而不是 operator +
  • @JemCpp 对不起我的错误我错过了那个细节。确实应该是Kvader&lt;Q&gt; Kvader&lt;Q&gt;::operator+(const Kvader&lt;Q&gt;&amp; temp)

标签: c++ operator-overloading class-template


【解决方案1】:

此代码包含一些错误:

1) Kvader&lt;Q&gt; Kvader&lt;Q&gt;::operator+(Kvader&lt;int&gt; temp)

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

2) Kvader&lt;Q&gt; operator+(Kvader&lt;int&gt;);

与 1) 相同 + 将参数类型更改为 Kvader&lt;int&gt; 而不是通用的 Kvader&lt;Q&gt;

3)Kvader&lt;Q&gt;(const Kvader&lt;Q&gt; &amp;temp);

同 1)。

4) 为Kvader&lt;Q&gt; 指定默认构造函数,否则main() 中的创建语句将失败。

5) 此外,operator+(const T&amp;) 应该返回一个引用以允许运算符链接。它通常还需要一个 const 引用以避免不必要的复制。

6) 最后,除非您有特定的理由按您的方式进行操作,否则应首先以通用方式定义 operator+(const Kvader&lt;Q&gt;&amp;) 之类的内容,然后在需要时进行专门化所以。按照您编写的方式,operator+(cont Kvader&lt;int&gt;&amp;) 仅适用于可以将this 对象的Q 类型添加到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;
}

【讨论】:

  • &lt;Q&gt;class Kvader { ... }; 中不是必需的,它是隐含的。
  • 我不是专家,一点也不,但是使用 gcc 4.9 作为后端的 cpp.sh 接受该代码。谢谢你的提示!我去看看 Josuttis 的书。
最近更新 更多