最終更新:2026-10-12
C++ テンプレート曖昧性解消¶
1.背景¶
最近、こんなコードを見かけました:
ここでの.templateは何を意味しているのでしょうか?
本節では実際の例から出発して、この意味を探っていきます。
2.template disambiguator¶
C++では、テンプレートの依存名(dependent names)を使うとき、テンプレート曖昧性解消子(template disambiguator)を使って、コンパイラがこれらの名前を区別できるように助ける必要がある場合があります。いわゆる「dependent names」とは、テンプレートパラメータに依存する型や値のことで、コンパイラはテンプレートをインスタンス化する前にそれらの具体的な意味を確定できません。このため、コンパイラがこれらの名前を解析するときに曖昧性が生じることがあります。
テンプレート曖昧性解消子(template disambiguator)はキーワード「template」を使って、特定の名前がテンプレートであることをコンパイラに明示的に伝えます。こうしてコンパイラは曖昧性を生じることなく、その名前を正しく解析できます。
キーワードtemplateが使えるのは、::(スコープ解決)、->(ポインタ経由のメンバアクセス)、.(メンバアクセス)の演算子においてのみです。以下はすべて有効な例です
- T::template foo
(); - s.template foo
(); - this->template foo
(); - typename T::template iterator
::value_type v;
公式資料:
次のようなコードがあるとします。.templateを付けないと何が得られるでしょうか?
template <typename T>
auto foo_is_not_a_template() {
// ((T::foo) < 34) > (::val())
return T::foo<34>::val();
}
上記は ((T::foo) < 34) > (::val()) として解析されます。
対応する.templateの例は次の通りです:
こうすると呼び出しは正しくテンプレート、foo<34>として解析されます。
本節の完全なコードは星球で公開します。興味があればぜひご参加ください。よろしくお願いします!
関連トピック¶
- C++ 純粋仮想関数と抽象クラス | C++那些事
- C++ assert アサーション | C++那些事
- C++ ビットフィールド | C++那些事
- C 言語による C++ 多態の実現 | C++那些事
- C++ const 定数と修飾 | C++那些事
- C++ const ファミリー | C++那些事
- C++ 間接参照演算子 * | C++那些事
- C++ 初期化と代入 | C++那些事
- C++ 複数戻り値の書き方 | C++那些事
- C++ mutable キーワード | C++那些事