コンテンツにスキップ

最終更新:2026-10-12

C++ テンプレート曖昧性解消

1.背景

最近、こんなコードを見かけました:

 auto chunk_left = first_sort_key.template GetChunk<ArrayType>(left);

ここでの.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;

公式資料:

https://en.cppreference.com/w/cpp/language/dependent_name

次のようなコードがあるとします。.templateを付けないと何が得られるでしょうか?

template <typename T>
auto foo_is_not_a_template() {
  // ((T::foo) < 34) > (::val())
  return T::foo<34>::val();
}

上記は ((T::foo) < 34) > (::val()) として解析されます。

対応する.templateの例は次の通りです:

template <typename T>
auto foo_is_a_template() {
  return T::template foo<34>::val();
}

こうすると呼び出しは正しくテンプレート、foo<34>として解析されます。

本節の完全なコードは星球で公開します。興味があればぜひご参加ください。よろしくお願いします!

関連トピック

コメント