Невозможно извлечь value_type из шаблона - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь извлечь value_type из контейнера, используя следующий код.

//CustomTraits.h
template<typename C, typename = void> 
struct has_push_back : std::false_type {};

template<typename C>
struct has_push_back<C, std::void_t<  decltype(std::declval<C>())::value_type > > :
  std::true_type {};

Это вызывается так

//MessaDecoder.h
template <typename Container, 
  typename = std::enable_if_t<has_push_back<Container>::value>
>
class MessageDecoder{/*Class Def...*/};

//Server.h
using buffer_t = std::deque<std::tuple<std::string, uint64_t>>;
std::shared_ptr<MessageHelper::MessageDecoder<buffer_t>> _decoder_ptr;

Я пробовал значительное количество вариантов в попытке заставить этот код компилироваться. Я проверил, что value_type является действительным, извлекая его как параметр шаблона в MessageDecoder.h с Container::value_type, и он компилируется. Однако, делая то же самое и то, что я описал выше в CustomTraits.h, не удается правильно запустить специализированный шаблон, и мне интересно, почему и как это исправить. Вот некоторые ошибки, которые я получаю.

Error   C3203   'MessageDecoder': unspecialized class template can't be used as a template argument for template parameter '_Ty', expected a real type  

Error   C2938   'enable_if_t<false,void>' : Failed to specialize alias template 

Я использую VS2017 C ++ 17 последнее обновление.

1 Ответ

0 голосов
/ 09 мая 2018

Изменение

decltype(std::declval<C>())::value_type

Для

typename C::value_type

declval дает вам ссылку на rvalue, вы не можете извлекать членов из ссылочных типов (и этот танец не нужен, так как вам нужен только тип, который у вас есть: C). И тебе не хватает typename.

...