std::hash 当 运行 ska::flat_hash_map 时没有名为 "hash_policy" 的类型

std::hash no type named "hash_policy" when running ska::flat_hash_map

我主要是一名 R 程序员,我正在使用 Rcpp 运行 Malte Skarupke 通过 RStudio(Microsoft OpenR ). C++ 编译器是带有 c11 标志的 g++ 运行。

他的 .hpp 文件没有更改,我无法获取它 运行ning,因为它会产生错误

Line 276 no type named 'hash_policy' in 'struct std::hash<char>'

flat_hash_map.hpp 中的违规行是

template<typename T>
 struct HashPolicySelector<T, void_t<typename T::hash_policy>>
 {
     typedef typename T::hash_policy type;
 };

我在 github 上找到了一些基准库,似乎包含没有问题的库,并且像 std::unordered_map 一样访问它,所以我不明白为什么我有问题达到 运行.

我也试过提供不同的类型而不是 char,坚持使用 std::hash 应该能够自动处理的类型,例如 int 和 std::string。

我的源文件非常简单,因为我实际上只是想创建一个哈希映射,例如,我最后一个 运行 使用的是这个:

#include <Rcpp.h>
#include "flat_hash_map.hpp"
using namespace Rcpp;

// [[Rcpp::plugins(cpp11)]]

// [[Rcpp::export]]

void run_test()
{

    ska::flat_hash_map<char,char> test_map;

}

我希望比我有更多 C++ 经验的人可以阐明这个问题,或者如果问题可以重现,请尝试 运行自己连接库。

感谢您的帮助! 这也是我在 Whosebug 上的第一个 post,如果我可以做些什么来改进我的问题,请告诉我。

GCC < 5.0 不会触发别名模板中未使用参数的替换失败。这种情况实际上在标准中未指定,最终由 CWG Issue 1558.

解决

作为解决方法,您应该手动替换 line 266:

template<typename...> using void_t = void;

与:

template <typename...>
struct voider { using type = void; };

template <typename... Ts>
using void_t = typename voider<Ts...>::type;

这会强制使用别名模板的模板参数,允许编译器排除未声明 [​​=12=].

的 SFINAE 类型