【发布时间】:2011-09-12 14:46:53
【问题描述】:
我正在尝试为非字符数组部分专门化一个特征:
template<typename T>
struct is_container : std::false_type {};
template<typename T, unsigned N>
struct is_container<T[N]>
: std::enable_if<!std::is_same<T, char>::value, std::true_type>::type {};
Visual Studio 2010 给了我一个 C2039(type 不是 enable_if... 的元素)。但是,SFINAE 不应该只是在这里触底而不是给出编译器错误吗?或者SFINAE不适用于这种情况?
当然,我可以将非字符和字符的特化分开:
template<typename T>
struct is_container : std::false_type {};
template<typename T, unsigned N>
struct is_container<T[N]> : std::true_type {};
template<unsigned N>
struct is_container<char[N]> : std::false_type {};
但我真的很想知道为什么 SFINAE 在这种特殊情况下不起作用。
【问题讨论】:
-
好吧,我认为
typename前面需要std::enable_if,因为依赖类型,但我不会把它作为答案,因为这只是猜测! -
@Arak:不。
typename在这种情况下不是必需的。在搜索基类时,编译器会在一开始就排除所有非类型。看到这个:stackoverflow.com/questions/4347730/… -
你能指定你想要做什么,例如您尝试实例化
is_container以使您期望SFINAE 启动的上下文是什么?另一方面,如果你只需要有条件的基础,像std::conditional这样的东西会更合适。 -
可能是硬错误的问题,你试过
boost::lazy_enable_if吗?
标签: c++ templates sfinae template-meta-programming enable-if