C での明示的なテンプレート コンストラクターの呼び出し
C では、初期化子リストでテンプレート コンストラクターを明示的に呼び出すことはできません。これは、テンプレート引数に使用される特定の構文が原因であり、構築中に括弧内に含まれるのではなく、関数テンプレート名に続きます。
C 標準 (14.8.1/7) に記載されているとおり、
[注: 明示的なテンプレート引数リストは関数テンプレート名に続き、変換メンバー関数テンプレートとコンストラクター メンバー関数テンプレートは関数名を使用せずに呼び出されるため、関数を提供する方法はありません。これらの関数テンプレートの明示的なテンプレート引数リスト。 ]
したがって、次の例は機能しません。
struct T { template<class> T(); }; struct U { U() : t<void>() {} //does not work T t; };
この場合、コンパイラーは t
回避策
この制限を回避するには、次の関数テンプレートを使用できます。引数としての ID タイプ:
struct T { template<class U> T(identity<U>); }; struct U { U() : t(identity<void>()) {} T t; };
次の ID 定義が与えられるとします。 Boost:
template<typename T> struct identity { typedef T type; };
または、C 20 では std::type_identity:
using ::std::type_identity;
を使用すると、このアプローチにより、初期化子リストのコンストラクターにテンプレート引数を効果的に渡すことができます。
以上がC イニシャライザ リストでテンプレート コンストラクタを明示的に呼び出せないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。