C++ 使用sizeof。。。在std::启用_if
下面的代码没有编译,我就是不明白为什么C++ 使用sizeof。。。在std::启用_if,c++,c++11,variadic-templates,template-meta-programming,enable-if,C++,C++11,Variadic Templates,Template Meta Programming,Enable If,下面的代码没有编译,我就是不明白为什么 template <class T, class... Ts> typename std::enable_if<sizeof...(Ts) > 0>::type func() { // nop } 模板 typename std::enable_if 0>::type func(){ //不 } 生成的错误消息是: error: expected unqualified-id before numeric consta
template <class T, class... Ts>
typename std::enable_if<sizeof...(Ts) > 0>::type func() {
// nop
}
模板
typename std::enable_if 0>::type func(){
//不
}
生成的错误消息是:
error: expected unqualified-id before numeric constant
typename std::enable_if<sizeof...(Ts) > 0u>::type func() {
^
错误:数字常量前应为非限定id
typename std::如果0u>,则启用:\u::type func(){
^
编译器需要使用括号才能正确解析:
template <class T, class... Ts>
typename std::enable_if<(sizeof...(Ts) > 0)>::type func() {
^ ^
// nop
}
模板
typename std::enable_if 0)>::type func(){
^ ^
//不
}
编译器将直角括号(
)解释为std::enable_if
的结束括号。这是因为一旦开始模板参数(或参数)列表,编译器第一次有机会关闭它(使用
),它就会这样做
解决方案(这证明了上述观点):不要关闭参数列表,反转条件并使用左尖括号:
template <class T, class... Ts>
typename std::enable_if< 0 < sizeof...(Ts) >::type func() {}
// ^ compilers are cool with this
模板
typename std::enable_if<0::type func(){}
//^编译器对此很酷
你能解释一下吗?@Incubbus我在回答中解释了理由并给出了一个聪明的解决方案