2016-05-25 9 views
2

積分型の部分的な特殊化を作成しようとしています。私の考えは次のように何かをした:特殊なパラメータでenable_ifを使用できないのはなぜですか?

#include <type_traits> 

template <typename T> 
struct Class { 
}; 

template <typename T> 
struct Class<typename std::enable_if<std::is_integral<T>::value, T>::type> { 
}; 

これをただし、次のエラーにつながる:

error: template parameters not deducible in partial specialization: 
struct Class<typename std::enable_if<std::is_integral<T>::value, T>::type> { 
    ^
note: 'T' 

私は、余分なテンプレートパラメータを使用する場合、それは動作しません:

#include <type_traits> 

template <typename T, typename Enable = void> 
struct Class { 
}; 

template <typename T> 
struct Class<T, typename std::enable_if<std::is_integral<T>::value>::type> { 
}; 

なぜ追加のテンプレートパラメータが必要ですか?

答えて

3

最初のケースでは、クラスを専門にしていません。 あなたが書くとき:Tは、まだ一般的なテンプレート型であり、あなたのコンパイラが混乱してしまうこと

template <typename T> 
struct Class<typename std::enable_if<std::is_integral<T>::value, T>::type> { 
}; 

。第2のケースで

は、あなたが

template <typename T> 
struct Class<T, typename std::enable_if<std::is_integral<T>::value>::type> { 
}; 

を書くときあなたは正しくテンプレートパラメータEnableを専門とし、すべてが正常に動作します。

あなたが最初のものを専門にしたい場合は、それはあなたが

template <> 
struct Class<std::enable_if<std::is_integral<int>::value, int>::type> { 
}; 
+0

しかし、専門はまた、クラスに解決されません。欲しいものはおそらくされていない、種類別すればよいですか?私はこの2番目のケースがどのようにコンパイラにはっきりしているのか理解できません。 –

+0

あなたは実際に 'Enable = void'を必要としません。それを残しておくとうまくいくはずです。 'template 'はすみません。 –

+1

ああ!わかりました!基本ケースはClass です。特殊化はクラスです。したがって、テンプレートパラメータEは現在特殊化されています。 Eがなければ、コンパイラーは部分的な特殊化が実行されていないと思うでしょう(その専門化は基本の場合と同じタイプです)。この光を照らしてくれてありがとう! –

関連する問題