【发布时间】:2018-06-06 08:47:13
【问题描述】:
这个版本很好用:
template<typename T>
struct Foo
{
template<typename U = T>
typename std::enable_if<std::is_same<U,A>::value>::type
bar() { std::cout << "1" << std::endl; }
template<typename U = T>
typename std::enable_if<std::is_same<U,B>::value>::type
bar() { std::cout << "2" << std::endl; }
};
此版本失败:
template<typename T>
struct Foo2
{
template<typename U = T, typename V = typename std::enable_if<std::is_same<U,A>::value>::type >
V bar() { std::cout << "1" << std::endl; }
template<typename U = T, typename V = typename std::enable_if<std::is_same<U,B>::value>::type >
V bar() { std::cout << "2" << std::endl; }
};
与:
错误:“模板模板 V Foo2::bar()”不能用“模板模板 V Foo2::bar()”重载
两个版本的区别在于第一个我直接使用表达式,第二个我创建一个模板默认参数并将其用作返回类型。
第二个例子失败的原因是什么?
【问题讨论】:
-
默认模板参数值不是函数签名的一部分
-
std::enable_ifdoc 中甚至还有一个关于这个常见错误的注释。
标签: c++ templates overloading sfinae