Последнее обновление: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++那些事