我想知道为什么类模板的外部运算符重载不支持隐式类型转换。这里是可工作的非模板版本:
class foo
{
public:
foo() = default;
foo(int that)
{}
foo& operator +=(foo rhs)
{
return *this;
}
};
foo operator +(foo lhs, foo rhs)
{
lhs += rhs;
return lhs;
}
如预期所料,以下行编译正确:
foo f, g;
f = f + g; // OK
f += 5; // OK
f = f + 5; // OK
f = 5 + f; // OK
另一方面,当类
foo
被声明为一个简单的模板时,如下所示:template< typename T >
class foo
{
public:
foo() = default;
foo(int that)
{}
foo& operator +=(foo rhs)
{
return *this;
}
};
template< typename T >
foo< T > operator +(foo< T > lhs, foo< T > rhs)
{
lhs += rhs;
return lhs;
}
以下代码行存在编译错误:
foo< int > f, g;
f = f + g; // OK
f += 5; // OK
f = f + 5; // Error (no match for operator+)
f = 5 + f; // Error (no match for operator+)
我希望了解为什么编译器(GCC 4.6.2)无法使用模板类的转换构造函数执行隐式类型转换。这是预期行为吗?除了手动创建所有必要的重载外,是否有任何解决方法?