То, что я прочитал в стандарте C ++ о введенных именах классов, противоречит (как я это вижу) поведению примера программы, которую я представлю в ближайшее время. Вот что я прочитал:
Из 3.4 (параграф 3)
Введенное-имя-класса класса (пункт 9) также считается член этого класса для целей сокрытия имени и поиска.
Из 9 (параграф 2)
Имя класса вставляется в область, в которой оно объявлено сразу после появления имени класса. Имя класса также вставлен в область видимости самого класса; это известно как введенное-имя-класса. Для проверки доступа injected-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
и ] std :: vector
, как если бы имя открытого члена, то оно должно быть унаследовано X, и поэтому имя vector
в X
должно быть неоднозначным. Я что-то упускаю?
P.S. Я использую MSVC9.0