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 类型
我主要是一名 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 类型