最近在写程序的时候遇到了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即可,结果错误消失了。

本文解决了编程中遇到的一个特定类型的编译错误:依赖名称被解析为非类型但实例化时却是类型的问题。通过在类型定义前添加typename关键字解决了该问题。
5259

被折叠的 条评论
为什么被折叠?



