为什么这个部分模板专业化失败了?

Why is this partial template specialization failing?

这是我的代码。

#include <iostream>

template<class> struct IsInteger;
template<class> struct IsInteger { using value = std::false_type; };
template<> struct IsInteger<int> { using value = std::true_type; };

int main()
{
   std::cout << std::boolalpha << 
   IsInteger<5>::value::value << '\n';
}

以上代码导致错误提示

Source.cpp(9,36): error C2974: 'IsInteger': invalid template argument for '<unnamed-symbol>', type expected

Source.cpp(9,50): error C2955: 'IsInteger': use of class template requires template argument list

我不明白为什么编译器不选择 template<> struct IsInteger<int> { using value = std::true_type; }; 在这种情况下。为什么会导致错误?

您需要将您的特征用作 IsInteger<int> 而不是 IsInteger<5>

此外,在这种情况下使用 std::true_typestd::false_type 的惯用方法是继承它们,而不是将它们别名为值:

template<class> struct IsInteger : std::false_type {};
template<> struct IsInteger<int> : std::true_type {};

int main()
{
   std::cout << std::boolalpha << IsInteger<int>::value << '\n';
}