无法从模板中提取value_type

时间:2018-05-08 22:07:05

标签: c++ c++11 c++17

我正在尝试使用以下代码从容器中提取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 :(得分:2)

更改

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

typename C::value_type

declval为您提供右值参考,您无法将成员从引用类型中拉出来(因为您只需要类型,所以不需要跳舞:C)。你错过了typename