我有一个模板类,有一些方法,比如foo
。我想为所有POD类型指定此方法的默认行为,并为其他类型引入单独的特化。 (真正的问题是更复杂,但这是一个MWE。)我试图用通常的方式与SFINAE一起做。
template<typename T>
class C {
public:
void foo(T t);
};
template<typename T>
typename std::enable_if<
std::is_pod<T>::value,
void>::type
C<T>::foo(T t) {
// do something
}
即使使用这段代码(即没有制作任何C的实例),我也有错误:
prototype for ‘typename std::enable_if<std::is_pod<_Tp>::value, void>::type C<T>::foo(T)’ does not match any in class ‘C<T>’
这对我来说似乎很奇怪,因为两种方法类型都是void
,或者第二种方法类型被SFINAE淘汰。
更奇怪的是,如果我用enable_if
替换false
中的条件,我收到的错误表明SFINAE根本不起作用:
error: ‘type’ in ‘struct std::enable_if<false, void>’ does not name a type
我哪里错了?
答案 0 :(得分:1)
对于SFINAE申请,标识符必须是模板,并且必须涉及替换。
第一种情况失败,因为foo
不是模板。
第二种情况由于同样的原因而失败,因为不涉及替代。