【发布时间】:2017-10-29 07:16:38
【问题描述】:
我创建了一个模板类 Number。我重载了
template<typename t>
class Number
{
private:
t n;
public:
Number(t a) :n{ a } {};
Number() :n{ t() } {};
friend ostream & operator<<<>(ostream & os, const Number<t>& a);
friend Number<t> operator%(Number<t> a, Number<t> b);
};
template<typename t>
ostream & operator<<<>(ostream & os, Number<t> a)
{
os << a.n;
return os;
}
template<typename t>
Number<t> operator%(Number<t> a, Number<t> b)
{
return Number<t>(a.n % b.n);
}
正如您在 ,它可以完成这项工作。但是如果我在 % 运算符定义中使用它,我会得到一个语法错误,如果我没有,我会得到 “1 个未解决的外部”错误。所以我的问题可以总结为两个问题—— 1. 为什么在使用友元符号重载运算符时需要使用? 2. 为什么它对 % 运算符不起作用?
【问题讨论】:
-
该死的好问题。我没有好的答案,你需要一个比我更好地了解模板的人,但我知道如果你将函数定义移到类中,问题就会消失:
friend Number<t> operator%(Number<t> a, Number<t> b) { return Number<t>(a.n % b.n); }废话答案,所以这是一个评论,但这就是我所做的继续前进。 -
因为injected class names,所以不需要在类中显式写
<t>。
标签: c++ class templates overloading operator-keyword