Хотя я не знаю, почему они решили включить эти с использованием объявлений, я могу сказать, почему код будет плохо образован без них.
Но сначала, повторяя из комментария:
с использованием декларирования не требует наличия определения выдвинутого объекта (здесь: он не требует наличия определения этих функций). Рассмотрим:
void foo();
int main()
{
using ::foo; // doesn't require the definition of `foo` to exist
return 0;
}
Если шаблон класса получает неявно экземпляр, декларации функций членов инстанцируются, но не их определения (в соответствии с [temp.inst]/1). Базовые классы шаблона класса также создаются, если указанный шаблон шаблона неявно создается (что, в свою очередь, приводит к созданию описаний функций-членов этих шаблонов базового класса). Поэтому с использованием декларации не помогает при создании экземпляра.
Эффект этих с использованием деклараций является то, что имена, объявленные открыты для не-зависимых имен поиска. В соответствии с [temp.dep]/3
В определении шаблона класса или класса, если базовый класс зависит от шаблона-параметра, объем базового класса не рассматриваются во имя неквалифицированного поиск [.. .].
В связанном коде мы находим, например, i<size()
. Имя size
здесь не зависит, поэтому область базового класса не выполняется, и eoPop <MOEOT> :: size
не будет найден без использования с использованием декларации.
Другая причина использования Использование-декларации - это если вы хотите перегрузить функцию-член базового класса. Если вы не используете use-decl, функция-член в производном классе просто скрывает каждую перегрузку (с тем же именем) в базовом классе. Насколько я вижу, это не используется в связанном коде.
КПП. Я не видел эту технику раньше; вы также можете использовать 'this-> size()' и т. д., чтобы найти эти функции-члены. Это интересный способ. – dyp