C では、初期化子リスト内でテンプレート コンストラクターを明示的に呼び出すことはできません。次の例を考えてみましょう:
struct T { template<class> T(); }; struct U { U() : t<void>() {} //does not work T t; };
C 標準ではコンストラクター メンバー関数テンプレートの明示的なテンプレート引数リストが明示的に禁止されているため、このコードはコンパイルに失敗します。これは、関数名を持たないコンストラクターの一意の構文によるものです。
説明: C 標準のセクション 14.8.1/7 では、
と規定されています。 「明示的なテンプレート引数リストは関数テンプレート名に続き、変換メンバー関数テンプレートとコンストラクター メンバー関数テンプレートは関数名を使用せずに呼び出されるため、関数を提供する方法はありません。これらの関数テンプレートの明示的なテンプレート引数リスト。"
回避策: 初期化子リスト内でテンプレート コンストラクターの明示的な呼び出しが必要な場合は、カスタム タイプを使用して回避策を採用できます。テンプレート パラメーターを引数として受け入れるコンストラクター:
struct T { template<class U> T(identity<U>); }; struct U { U() : t(identity<void>()) {} T t; };
この場合、Boost ライブラリからの ID タイプまたはC 20 の std::type_identity を使用して、テンプレート パラメーターの型を表すことができます。これにより、このカスタム タイプのオブジェクトを使用して、テンプレート コンストラクターを間接的に呼び出すことができます。
以上がC イニシャライザ リストでテンプレート コンストラクタを明示的に呼び出せないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。