C 11:unique_ptr抱怨不完整的类型,但不包括它
发布时间:2020-12-16 05:04:55 所属栏目:百科 来源:网络整理
导读:在SO上已经有很多关于unique_ptr和不完整类型的问题,但没有一个可以给我一个概念来理解为什么以下不起作用: // error: ... std::pair...::second has incomplete typetemplatetypename K,typename T struct Impl { typedef typename std::unordered_mapK,Im
在SO上已经有很多关于unique_ptr和不完整类型的问题,但没有一个可以给我一个概念来理解为什么以下不起作用:
// error: ... std::pair<...>::second has incomplete type template<typename K,typename T> struct Impl { typedef typename std::unordered_map<K,Impl<K,T>>::iterator iter_type; std::unique_ptr<iter_type> ptr; Impl() : ptr(new iter_type()) {} }; int main() { Impl<int,int>(); return 0; } 而以下是: template<typename K,typename T> struct Impl { struct Wrapper { typedef typename std::unordered_map<K,T>>::iterator iter_type; iter_type iter; }; std::unique_ptr<Wrapper> ptr; Impl() : ptr(new Wrapper()) {} }; int main() { Impl<int,int>(); return 0; } 我没有看到技术差异在哪里:如果std :: pair< ...> :: second(即Impl< K,T>)在第一个例子中对Impl不完整,那么它应该是不完整的包装在第二个也是如此.也, 更新: 在DietmarKühl回答之后,我认为问题可以归结为以下几点: template<typename K,typename T> struct Impl { typename std::unordered_map<K,T>>::iterator ptr; }; VS template<typename K,typename T> struct Impl { struct Wrapper { typename std::unordered_map<K,T>>::iterator iter; }; Wrapper *ptr; }; 解决方法
在第一种情况下,不完全类型的问题与std :: unordered_map< K,Impl< K,T>一起使用:为了确定迭代器是什么,std :: unordered_map< K,T>的部分.需要在仅宣布Impl时进行实例化. std :: unique_ptr< ...>与错误没有关系.您可以删除iter_type的使用,因为typedef需要验证它是否为类型.
另一方面,在将迭代器类型的使用包装到Wrapper中时,在构造函数实现之前不使用此嵌套类型.当然,内联定义函数的行为就好像类刚刚完全定义,它们只是在类定义之外实现,即上面的代码相当于 template<typename K,T>>::iterator iter_type; iter_type iter; }; std::unique_ptr<Wrapper> ptr; Impl(); }; template<typename K,typename T> Impl<K,T>::Impl() : ptr(new Impl<K,T>::Wrapper()) {} 也就是说,当需要并实例化Wrapper的定义时,定义了Impl. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |