std :: hash нет типа с именем "hash_policy" при запуске ska :: flat_hash_map - PullRequest
0 голосов
/ 25 ноября 2018

Я в основном программист на R, и я использую Rcpp для запуска реализации хэш-карты Малте Скарупке под названием ska :: flat_hash_map в Windows 10 через RStudio (Microsoft OpenR).Компилятор C ++ - это g ++, запускаемый с флагами c11.

Без изменений в его файле .hpp, я не могу запустить его, так как он выдает ошибку

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 ++, чем я, мог бы пролить свет на проблему или попробовать запустить библиотеку самостоятельно, если проблема воспроизводима.

Спасибо за помощь!Это также мой первый пост в StackOverflow, пожалуйста, дайте мне знать, если я могу что-то сделать, чтобы улучшить свой вопрос.

1 Ответ

0 голосов
/ 25 ноября 2018

GCC <5.0 не будет вызывать сбой подстановки для неиспользуемых параметров в шаблоне псевдонима.Этот случай фактически не был указан в стандарте и в конечном итоге решен с помощью <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1558" rel="nofollow noreferrer"> CWG Issue 1558 .

. В качестве обходного пути вы должны вручную заменить строку 266 :

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

с:

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

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

Это заставляет использовать параметры шаблона шаблона псевдонима, позволяя компилятору выводить типы SFINAE, которые не объявляют hash_policy.

...