我想知道为什么隐式类型转换不适用于类模板上的外部操作符重载。以下是工作的非模板化版本:
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)不能使用类的模板版本的转换构造函数执行隐式类型转换。这是预期的行为吗?除了手动创建所有必要的重载外,是否有解决此问题的方法?
发布于 2012-01-17 13:32:43
所有可能的foo<T>
都是来自int
的同样有效的转换,因为构造函数接受int
,而不是模板类型。编译器不能使用运算符中的另一个参数来猜测您想要的是哪一个,因此您会得到错误。如果你明确地告诉它你想要哪个实例化,我相信它会工作的。
https://stackoverflow.com/questions/8890051
复制相似问题