То, что я прочитал в стандарте С++ о введенных именах классов, противоречит (как я вижу) с поведением примерной программы, которую я представлю в ближайшее время. Вот что я читал:
-
Из 3.4 (параграф 3)
Введенное имя класса класса (пункт 9) также считается член этого класса для скрытия имени и поиска.
-
От 9 (параграф 2)
Имя класса вставляется в область, в которой она объявлена сразу после просмотра имени класса. Название класса также вставлен в сферу действия самого класса; это известно как впрыскивается класс имя. В целях проверки доступа inted-class-name рассматривается как имя публичного участника.
Из этого я понимаю, что следующее является хорошо сформированной единицей перевода и успешно компилируется.
#include <vector>
class X: std::vector<int>
{
vector mem;
};
Однако я бы предположил, что следующее должно было произвести ошибку, но это не
#include <vector>
class X: std::vector<int>, std::vector<char>
{
vector mem; //compiles OK... mem is apparently std::vector<int>
};
Так как имя vector
вводится как в std::vector<int>
, так и в std::vector<char>
как имя публичного члена, оно должно быть унаследовано X, поэтому имя vector
в X
должно быть неоднозначным. Я что-то пропустил?
P.S. Я использую MSVC9.0