2013-10-12 3 views
1

Какой смысл следующих с помощью декларацийC++ с использованием деклараций

using eoPop<MOEOT>::size; 
using eoPop<MOEOT>::operator[]; 
using eoPop<MOEOT>::back; 
using eoPop<MOEOT>::pop_back; 

Взятый из класса, определенного here. Конечно, потому что eoPop<EOT> наследует std::vector<EOT>, методы , operator[], back и pop_back являются общедоступными, нет необходимости в использовании декларации. Используется ли используемое объявление для создания экземпляра?

+0

КПП. Я не видел эту технику раньше; вы также можете использовать 'this-> size()' и т. д., чтобы найти эти функции-члены. Это интересный способ. – dyp

ответ

2

Хотя я не знаю, почему они решили включить эти с использованием объявлений, я могу сказать, почему код будет плохо образован без них.

Но сначала, повторяя из комментария:

с использованием декларирования не требует наличия определения выдвинутого объекта (здесь: он не требует наличия определения этих функций). Рассмотрим:

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, функция-член в производном классе просто скрывает каждую перегрузку (с тем же именем) в базовом классе. Насколько я вижу, это не используется в связанном коде.

+0

Спасибо! «Не знал, что перегрузка метода в производном классе скроет все * другие методы, имеющие одно и то же имя в базовом классе! Не стоит недооценивать способность C++ смущать вас :-) – Olumide

Смежные вопросы