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
、2 番目の例でも不完全である必要があります。また、構造体でラップするだけで十分unique_ptr
な場合、最初のケースに制限があるのはなぜですか?
更新:
ディートマー・キュールの答えの後、問題は次のように縮小できると思います。
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;
};