【发布时间】:2014-12-04 18:17:57
【问题描述】:
我有以下示例代码:
class Serializable {};
class MyData : public Serializable {};
void GetData( Serializable& ) {}
template<typename T>
void GetData( T& data )
{
std::istringstream s{"test"};
s >> data;
}
int main()
{
MyData d;
GetData(d);
}
根据重载决议规则,应该首选非模板版本,因为基类的类型为Serializable。但是,我希望 SFINAE 在模板版本中在为重载解析实例化时出现错误时启动(因为如果没有为类型定义 >> 运算符,则不应考虑)。
为什么不使用模板还是失败?
【问题讨论】:
-
the non-template version should be preferred仅在完全匹配的情况下。看看如果你使用MyData而不是Serializable会发生什么。
标签: c++ templates language-lawyer overload-resolution upcasting