我有類似這樣的一個問題:SFINAE tried with bool gives compiler error: "template argument ‘T::value’ involves template parameter"默認參數 - >模板參數包括模板參數
我想定義一個特點是,告訴我們一個複雜的表示是結構的數組,其中實值從來AOS因此沒有用戶定義的特化應該是必需的,但對於複雜的你總是需要一個:
/**
* Evaluates to a true type if the given complex type is an Array of Structs, false otherwise
* Defaults to false for Real values
*/
template< typename T, bool T_isComplex = IsComplex<T>::value >
struct IsAoS: std::false_type{};
/**
* Undefined for (unknown) complex types
*/
template< typename T >
struct IsAoS< T, true >;
專業化是在STD-方式通過的std ::真/ false_type獲得完成。
問題是:在這個實現中,我得到了「模板參數涉及到模板參數」錯誤(在鏈接問題中解釋過),但是如果我切換到類型(在第一個模板中省略「並在第二個變爲true_type)複合類型將不再匹配第二個模板,因爲唯一的派生自std :: true_type,而不是std :: true_type。
我唯一能想到的解決方案是使用表達式SFINAE,並將主模板的第二個參數更改爲默認的void和enable_if(isComplex == false)。有什麼更好的?
[你的代碼應該沒問題](http://coliru.stacked-crooked.com/a/cb2dee9c0e1ff3ed),這實際上是一種相當普遍的技術。你正在使用哪個編譯器,哪個版本? –
那麼,你修改了代碼,使IsAoS默認爲true,對於所有錯誤/危險的複雜類型。我的例子:http://coliru.stacked-crooked.com/a/086450479bc561db – Flamefire
編譯器的要點是你不能寫'struct IsAoS>',並使用主模板的默認模板參數填補這個部分專業化的第二個參數,因爲那取決於'T',所以是不允許的。 (導致錯誤的代碼段應該真的存在於你的問題中。)期望的行爲是什麼 - 默認爲'false_type',除非'IsComplex :: value'爲'true',在這種情況下,除非用戶提供專門化,否則它應該是錯誤的? –