私はいくつかのコードを持っていますが、なぜそれがMSVC
(2010 Express、2012 RC) でコンパイルされず、他のコンパイラ (たとえばgcc 4.7
) でコンパイルされないのか理解できません。それはバグですかMSVC
(Googleで検索しようとしましたが、このバグの説明が見つかりません)、または標準でサポートされていない何かをしていますか?
template<typename T, T Val>
struct integral_c
{
typedef integral_c<T, Val> type;
static const T value = Val;
};
typedef integral_c<bool, true> true_;
typedef integral_c<bool, false> false_;
template<bool Cond, typename T = void>
struct enable_if
{
typedef T type;
};
template<typename T>
struct enable_if<false, T>
{
};
template<typename T>
struct is_int : false_
{
};
template<>
struct is_int<int> : true_
{
};
template<typename T, typename = void>
struct identity_if_int
{
};
template<typename T>
struct identity_if_int<T, typename enable_if<is_int<T>::type::value>::type>
{
typedef T type;
};
int main()
{
identity_if_int<int>::type t = 0;
}
http://liveworkspace.org/code/311b71954b168862b19043ba49670856
MSVC
それenable_if<false>
には member がありませんtype
。私identity_if_int
が好きなように専門化するとき
template<typename T>
struct identity_if_int<T, typename enable_if<is_int<T>::value>::type>
{
typedef T type;
};
すべて正しく動作します。何が問題ですか?MSDN (またはその他のもの) へのヘルプとリンクを歓迎します。