我正在尝试构建一个模板化的 num 类。该类需要有一个类型为 T
的公共(public)属性 val
,这是唯一的模板化参数。此外,如果提供一个值,则应使用该值初始化属性 (val
)。为此,我编写了以下代码:
#include <iostream>
template<class T>
class Num {
public:
T val;
Num():val(0) { std::cout<<"default constr used"<<std::endl; }
Num(T value):val(value) {std::cout<<"constr (T value) used"<<std::endl; }
~Num() { std::cout<<"destructor used"<<std::endl; }
template<typename U>
Num operator+(const Num<U>& other) {
return val+other.value;
}
};
此外,我创建了 main()
函数来测试程序,如下所示:
int main() {
std::cout << Num<int>(1) + Num<double>(2.0);
return 0;
}
但是程序的结果现在是3
。而我预计它是 3.0
(类型为 double
)。
最佳答案
为此,您需要更改返回类型。
在您的代码中:
// vvv---- Means Num<T>
Num operator+(const Num<U>& other) {
return val + other.val;
}
事实上,在类模板中,您可以键入不带模板参数的类名称,这在某种程度上相当于编写 Num<T>
.
无论加法本身的类型是什么,您的函数始终返回第一个操作符的类型。
您想要的是从加法中推断出该类型:
auto operator+(const Num<U>& other) -> Num<decltype(val + other.val)> {
return val + other.val;
}
这样,根据 C++ 运算符规则,它始终是正确的返回类型。
关于c++ - 模板类运算符重载返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59256707/