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

标签 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(...);
   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(是的,我知道它很旧)

最佳答案

您没有使用模板 U在你的test方法:

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)对于 test<Container>(0) .如果你的编译器支持它(好吧,gcc 4.5 不支持......),你可以使用 nullptr而不是 0 .

关于c++ - 我的 SFINAE 检查 std::map/std::vector 有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10871850/

相关文章:

c++ - 如何专门化模板函数以区分void和non-void函数参数

c++ - 基于 SFINAE 的模板方法特化

c++ - 将 std::map 复制到成对的 std::vector 中

c++ - template<class = enable_if_t<...>> 做什么?

c++ - 为什么我们有 std::string::npos 但没有 std::vector::npos?

c++ - 在开始时使用所有可用数据构建大型(ish)无序集

c++ - bool 指针成员在分配 true 与 false 时的行为不同

c++ - 真正基础的 SSE

关于运算符重载和内存泄漏的 C++ 引用

c++ - 无法将shared_ptr<Derived>作为shared_ptr<Base>引用传递