最近在写程序的时候遇到了XXX is parsed as a non-type, but instantiation yields a type 的错误。程序上下文如下
template<typename FullKey,// base containe
typename PolicyTraits
>
class container_with_policy
{
private:
FullKey m_cache;//initialize first
public:
struct container_element
{
typename PolicyTraits::policy_hook_type policy_hook_;
typename FullKey::iterator m_iterator;
typedef typename PolicyTraits::template container_hook<container_element>::type PolicyHook;
typename FullKey::iterator& operator&(){return m_iterator;};
container_element& operator=(typename FullKey::iterator& it)
{
m_iterator=it;
return *this;
}
container_element(){};
container_element(const typename FullKey::iterator& it):m_iterator(it){}
};
typedef typename FullKey::iterator iterator;
typedef typename FullKey::const_iterator const_iterator;
typedef typename PolicyTraits::template policy<
FullKey,
container_element,
container_element::PolicyHook >::type policy_container;
typedef typename FullKey::value_type base_element_type;
///
container_with_policy();
~container_with_policy();
};
在
<pre name="code" class="cpp">container_element::PolicyHook >::type policy_container;
这一行里,编译器提示
error: dependent-name ‘ns3::ndn::container_with_policy<FullKey, PolicyTraits>::container_element:: PolicyHook’ is parsed as a non-type, but instantiation yields a type container_element::PolicyHook >::type policy_container;
大意是说PolicyHook在编译器看来不是一个类型,但是却要它作为一个类型来使用。
但是没理由啊,
typedef typename PolicyTraits::template container_hook<container_element>::type PolicyHook;
这里已经把PolicyHook作为一个typedef了。
仔细看看,原来凡是typedef的内容,在使用的时候,要在前面加上typename, 否则编译器搞不清楚这个到底是你写错了还是真的有这个类型。
修改方法:
把container_element::PolicyHook前面添加typename,改成typename container_element::PolicyHook即可,结果错误消失了。