以下代码无法编译,我无法弄清楚原因。
template <class T, class... Ts>
typename std::enable_if<sizeof...(Ts) > 0>::type func() {
// nop
}
产生的错误信息是:
error: expected unqualified-id before numeric constant
typename std::enable_if<sizeof...(Ts) > 0u>::type func() {
^
答案 0 :(得分:13)
编译器需要正确解析这个括号:
template <class T, class... Ts>
typename std::enable_if<(sizeof...(Ts) > 0)>::type func() {
^ ^
// nop
}
答案 1 :(得分:10)
编译器将右尖括号(>
)解释为std::enable_if
的右括号。这是因为一旦你开始一个模板参数(或参数)列表,第一次,编译器,有机会关闭它(使用>
),它就会这样做。
解决方案(证明了上述观点):不要关闭参数列表,反转条件并使用左尖括号:
template <class T, class... Ts>
typename std::enable_if< 0 < sizeof...(Ts) >::type func() {}
// ^ compilers are cool with this