時にはそれが再帰構造を得るために、不完全な型を持つ標準コンテナをインスタンス化すると便利です:標準のコンテナテンプレートを不完全な型でインスタンス化できますか?
struct multi_tree_node { // Does work in most implementations
std::vector<multi_tree_node> child;
};
struct trie_node { // Does not work in most implementations
std::map< char, trie_node > next;
};
これは、コンテナがいずれかを渡すか、または戻り値の型value_type
またはメンバ関数のメンバーを持っていないので、動作する傾向があるvalue_type
オブジェクトを値で表します。スタンダードは不完全なテンプレート引数についてはあまり言わないようですが、C++ 11§17.6.4.8[lib.res.on.functions]、「他の関数の要件」の下に1ビットがあります:
特に、以下の場合、効果は未定義です。テンプレートコンポーネントをインスタンス化する際にテンプレート引数として不完全な型(3.9)が使用されている場合(そのコンポーネントに対して特に許可されていない場合)
インスタンス化がブロックスコープ内にないにもかかわらず、これにより上記の構文が不正になりますか?これは「標準ライブラリテンプレートコンポーネントをインスタンス化するために使用される型の操作」(17.6.4.8も参照)にありますか?または、特に必要なインスタンス化がすべて成功した場合に、不完全な型に対して失敗する可能性のあるテンプレートのインスタンス化を禁止するライブラリ実装ですか?
編集:だけ呼び出し、制限、その他の機能をインスタンス化「タイプの操作を...」ブロックスコープのものにすることができる機能は、署名と部材の内容より厳しい要件にメンバ関数の内容を保持するように思われるためクラス定義。結局のところ、タイプが完了するまでをmulti_tree_node
とすることは間違いありません。これは、ブロックスコープで使用されていても、不完全な型引数であるを明示的にサポートするstd::unique_ptr
にも及んでいます。
編集2:trie_node
の例をテストすることを迷惑にならないように私に奉仕します。 @Iseリンクされたthe articleの破損の例と同じです。しかし、記事は "それがうまくいかない"ということを当然のように思っているようだが、解決策は私にとっては単純だと思われる - std::map
の内部tree_node
クラスはメンバ非テンプレートクラスではなく非メンバテンプレートでなければならない。
とにかく、その記事はデザインの意図をかなりよく確立しているので、「機能に関する要件」の副題になっているというニットピックはちょうどそのことです。任意の具体的な実装は、このような構成をサポートしている問題がない場合でも、
は標準は、単にあなたがこれを行う必要がありません言う:
投稿したコードに不完全な型はありませんか? –
@JohnDibling: 'trie_node'は' next'を定義するときに不完全です。 –
@ JohnDiblingクラスのスコープ内では、不完全です。 – Potatoswatter