2017-06-13 125 views
1

我的問題可能與this one有關,但我認爲我沒有「部分專用的非類型參數表達式」,或者不理解關係。C++模板專業化與非類型參數包失敗

下面的代碼產生具有MSVC14編譯器(CPP11)一個內部錯誤:

template<typename T, T... Elmts> 
struct NonTyped 
{ 

}; 

template<typename T> 
struct is_NonTyped_of_type 
{ 
    template<typename TL> 
    static constexpr bool check = false; 

    template<T... Elmts> 
    static constexpr bool check<NonTyped<T, Elmts...>> = true; 
}; 

cout << is_NonTyped_of_type<int>::check<NonTyped<int, 5>> << endl; 

僅使用一個非類型參數,而不是一個非類型參數包會按預期方式工作,但是這種失敗。

這是標準禁止或未定義的嗎?它打破了什麼規則?

任何解決方法?

非常感謝!

編輯

solution通過@StoryTeller給出實際上確實不MSVC14工作,但非常有助於瞭解我們這裏有問題。感謝您的幫助,StoryTeller!

回答

2

Clang接受你的代碼,而GCC沒有。變量模板的部分專業化應該沒問題。你總是可以回到使用常規類模板進行實際計算的久經考驗的方式。

template<typename T> 
class is_NonTyped_of_type 
{ 
    template<typename TL> 
    struct check_impl : std::false_type {}; 

    template<T... Elmts> 
    struct check_impl<NonTyped<T, Elmts...>> : std::true_type {}; 

public: 
    template<typename TL> 
    static constexpr bool check = check_impl<TL>::value; 
}; 
+0

我很困惑,事實上編譯器不能以相同的方式處理這種可能性!謝謝,我不知道我使用'constexpr'而不是'struct'是這個奇怪行爲的原因! – Michel

+2

@Michel - 對,別名/變量tempaltes的處理有時很奇怪。有幾個語言缺陷報告可以證明這一點。最強大的方法是使用像C++ 03中那樣的類。然後,讓alias /變量以方便的方式公開結果。標準庫甚至可以使用新添加的類型特徵。 – StoryTeller

+0

此評論非常有用!非常感謝你! – Michel