加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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不完整,那么它应该是不完整的包装在第二个也是如此.也,
当在结构中包装unique_ptr足够时,为什么第一种情况有限制?

更新:

在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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读