2015-06-20 102 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() { ... }