gpt4 book ai didi

C++11 : unique_ptr complains about incomplete type, 但是当我包装它时不是

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:40:00 29 4
gpt4 key购买 nike

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,Impl<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 是不完整的在第一个示例中,Wrapper 应该是不完整的在第二个也是如此。还,当足以包装 unique_ptr 时在一个结构中,为什么对第一种情况有限制?

更新:

经过Dietmar Kühl的回答,我觉得问题可以归结为:

template<typename K, typename T> struct Impl {
typename std::unordered_map<K,Impl<K,T>>::iterator ptr;
};

对比

template<typename K, typename T> struct Impl {
struct Wrapper {
typename std::unordered_map<K,Impl<K,T>>::iterator iter;
};
Wrapper *ptr;
};

最佳答案

第一种情况的问题是不完整的类型与std::unordered_map<K, Impl<K, T>一起使用: 判断什么iteratorstd::unordered_map<K, Impl<K, T> 的一部分需要在 Impl 时实例化只是宣布。 std::unique_ptr<...>与错误无关。您可以删除 iter_type 的使用作为typedef需要验证它是一个类型。

另一方面,当将迭代器类型的使用包装到 Wrapper 中时,在构造函数实现之前不使用此嵌套类型。当然,内联定义函数的行为就好像类刚刚被完全定义并且它们是在类定义之外实现的,即上面的代码等同于

template<typename K, typename T> struct Impl {
struct Wrapper {
typedef typename std::unordered_map<K,Impl<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已定义。

关于C++11 : unique_ptr complains about incomplete type, 但是当我包装它时不是,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18424025/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com