Перейти к содержанию

Последнее обновление: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>.

Полный код этого раздела будет опубликован в 知识星球; если интересно, присоединяйтесь. Спасибо!

Похожие темы

Комментарии