2015-06-20 103 views
1

此代码VS2015:可变参数模板特

#include <iostream> 
#include <type_traits> 

template<typename Head, typename... Tail> 
struct Is_Admitted { 
    constexpr static bool value = Is_Admitted<Head>::value && Is_Admitted<Tail...>::value; 
}; 

template<> 
template<typename T> 
struct Is_Admitted<T> : public std::false_type{}; 

template<> struct Is_Admitted<int> : public std::true_type{}; 
template<> struct Is_Admitted<double> : public std::true_type{}; 

int main() 
{ 
    std::cout << Is_Admitted<int, double>::value << '\n'; 
    std::cout << Is_Admitted<int, char>::value << '\n'; 
} 
  • 编译并GCC下运行良好(> = 4.7,用C++ 11,C++ 14或C++ 17支持启用)
  • 编译与一个警告,并用clang 3.6运行良好(与C++ 11,C++ 14或支持C++ 17支持)
  • 确实与以下错误VS2015RC(或预览)下编译:

(由我自己的错误描述翻译成英文,因为我无法设置英语编译语言,所以他们可能会与原有的不匹配)

error C2910: 'Is_Admitted<T,>': impossible to perform explicit specialization 
error C2065: 'value': undeclared identifier 
error C2976: 'Is_Admitted': insufficients template arguments 
error C2131: constant expression does not return any value 

哪个编译器是正确的,哪一个是错的?该代码是否符合C++ 11,C++ 14或C++ 17标准?

什么是正确的方法来做我想做的事情,那是一个可变类型的函数,只有当所有的模板类型参数都是一些被允许的类型时才返回true。

+2

这是模板<>'是多余的 –

+0

@DieterLücking噢,我的!我补充说,因为我很确定VS没有给我错误,但它不是真的。你说得对,谢谢。错误是cpp文件中的错字! –

回答

2

你有一个额外template<>这里:

template<> // <=== 
template<typename T> 
struct Is_Admitted<T> : public std::false_type{}; 

您的代码通过webcompiler给了我同样的错误。 只需删除它,它编译得很好。我不明白这是如何编译gcc或铿锵声。

两个template声明是只在必要时你定义的类定义之外的类模板的成员模板,例如:

template <typename T> 
struct Foo { 
    template <typename U> 
    void bar(); 
}; 

template <typename T> 
template <typename U> 
void Foo<T>::bar() { ... }