4

我有一个简单的 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)
 };

 struct sfinae_test {
   typedef char Yes;
   typedef long No;
   static void* const null;
 };

当我用 实例化它时HasKeyType<std::vector<int> >::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> >’

我完全被难住了。为什么HasKeyType不完整,为什么 SFINAE 不起作用?

如果我实例化实际上一个键类型()(B),我也会得到类似的错误。(C)HasKeyType<std::map<int,float> >int

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

4

1 回答 1

4

您没有Utest方法中使用模板:

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
};

请注意,我更改了test(null)for a test<Container>(0)。如果您的编译器支持它(好吧,gcc 4.5 不...),您可以使用nullptr而不是0.

于 2012-06-03T16:12:27.510 回答