【发布时间】:2019-05-22 17:54:58
【问题描述】:
考虑以下类,其中第一个是模板化的。两者都用于保存数值。
template<typename T>
struct foo
{
foo(T val) : val{ val } {}
T val;
};
struct bar
{
bar(double val) : val{ val } {}
double val;
};
我想定义一种方法将这些类添加在一起以获得具有不同值的新类。
template<typename T>
foo<T> operator+(foo<T> a, foo<T> b)
{
return foo<T>(a.val + b.val);
}
bar operator+(bar a, bar b)
{
return bar(a.val + b.val);
}
当我将这些运算符与隐式转换一起使用时,使用 foo 类型对象的运算符不会对双精度值使用隐式转换来应用我的重载运算符,即使它可以为非模板类执行此操作.结果是没有与该表达式中的类型匹配的运算符。
int main()
{
foo<double> foo_value(11.0);
bar bar_value(11.0);
foo<double> ev1 = foo_value + 1.0; // no operator matches these operands
bar ev2 = bar_value + 1.0;
}
操作符必须先显式实例化吗?如果是这样,a) 看起来如何,以及 b) 如果可以在初始化 foo<double> 类型的对象时完成实例化,为什么不隐式完成?
如果标准不支持任何类型的解析而不明确地将1.0 转换为foo<double> 类型的值,我认为唯一的另一种可能性是为我想要使用的每种类型定义运算符重载(对于左右两边)?
【问题讨论】:
-
bar_value和1.0是不同的类型,不会匹配单个T和1.0没有隐式转换可以防止模板编程中的很多麻烦。 -
声明
bar ev2 = bar_value + 1.0没有问题;隐式转换用于匹配我定义的运算符。foo<double> ev2 = foo_value + 1.0的情况并非如此,即使隐式转换似乎很明显。
标签: c++ templates visual-c++ operator-overloading