C++ 我的SFINAE检查std::map/std::vector有什么问题?

C++ 我的SFINAE检查std::map/std::vector有什么问题?,c++,sfinae,c++-standard-library,C++,Sfinae,C++ Standard Library,我有一个简单的SFINAE场景来区分标准容器,如std::map: template <typename Container> struct HasKeyType : sfinae_test { // (C) template <typename U> static Yes test(typename Container::key_type*); // (A) template <typename U> static No test(...);

我有一个简单的SFINAE场景来区分标准容器,如
std::map

 template <typename Container> struct HasKeyType : sfinae_test { // (C)
   template <typename U> static Yes test(typename Container::key_type*); // (A)
   template <typename U> static No test(...);
   enum {value = (sizeof(test(null)) == sizeof(Yes))}; // (B)
 };
当我用
HasKeyType::value
实例化它时,我得到

(A) error: no type named ‘key_type’ in ‘class std::vector<int>’
(B) error: invalid use of incomplete type ‘struct HasKeyType<std::vector<int> >’
(C) error: declaration of ‘struct HasKeyType<std::vector<int> >’
(A)错误:“class std::vector”中没有名为“key\u type”的类型
(B) 错误:不完整类型“struct HasKeyType”的使用无效
(C) 错误:“struct HasKeyType”的声明
我完全被这件事难住了。为什么
HasKeyType
不完整,为什么SFINAE不工作

如果实例化实际上有一个键类型(
int
)的
HasKeyType
,我也会得到与
(B)
(C)
类似的错误


g++版本:4.5.2(是的,我知道它很旧)

您在
测试方法中没有使用模板
U

template <typename Container> struct HasKeyType : sfinae_test { // C
  template <typename U> static Yes test(typename U::key_type* ); // A
  template <typename U> static No test(U*);
  enum {value = (sizeof(test<Container>(0)) == sizeof(Yes))}; // B
};
模板结构HasKeyType:sfinae_test{//C
模板静态是测试(typename U::key_type*);//A
模板静态无试验(U*);
枚举{value=(sizeof(test(0))==sizeof(Yes))};//B
};

注意,我将
测试(null)
更改为
测试(0)
。如果您的编译器支持它(GCC4.5不支持…),您可以使用
nullptr
而不是
0

哦,天哪,我一定是瞎了。我已经看了一个多小时了。谢谢4.5还不老!我必须每天使用2.95(针对我们的SPARC Sol-8客户)。
template <typename Container> struct HasKeyType : sfinae_test { // C
  template <typename U> static Yes test(typename U::key_type* ); // A
  template <typename U> static No test(U*);
  enum {value = (sizeof(test<Container>(0)) == sizeof(Yes))}; // B
};