То, что я читаю в стандарте C ++ относительно введенных имен классов, противоречит (на мой взгляд) поведению примера программы, которое я вскоре представлю. Вот что я читаю:
От 3,4 (пункт 3)
Имя введенного класса класса (раздел 9) также считается
член этого класса в целях сокрытия имени и поиска.
Из 9 (пункт 2)
Имя класса вставляется в область, в которой оно объявлено
сразу после того, как имя класса замечено. Имя класса также
вставляется в область действия самого класса; это известно как
впрыскивается класс имя. В целях проверки доступа
имя введенного класса обрабатывается так, как если бы оно было публичным именем участника.
Исходя из этого, я понимаю, что следующий текст является правильно сформированным модулем перевода и успешно компилируется.
#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