关于 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;
};