Подтвердить что ты не робот

Неоднозначное введенное имя класса не является ошибкой

То, что я прочитал в стандарте С++ о введенных именах классов, противоречит (как я вижу) с поведением примерной программы, которую я представлю в ближайшее время. Вот что я читал:

  • Из 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

4b9b3361

Ответ 1

Я нашел его! Это прямо в стандарте! Я был прав! Это должно быть неоднозначно!

Пункт 14.6.1 Пункт

Поиск, который находит имя с введенным классом (10.2), может привести к двусмысленность в некоторых случаях (например, если она встречается в более чем один базовый класс). Если все введенные имена классов, которые найдены обратитесь к специализациям одного и того же шаблона класса, а если имя за которым следует список шаблонов-аргументов, ссылка ссылается на класса, а не его специализацию, и не неоднозначный. [Пример:

template <class T> struct Base { };
template <class T> struct Derived: Base<int>, Base<char> 
{ 
    typename Derived::Base b; // error: ambiguous typename 
    Derived::Base<double> d;  // OK 
};

-end пример]

Нижняя строка: Это еще один компилятор Microsoft BUG. Отключение языковых расширений также не помогает.

Ответ 2

Нет, вам ничего не хватает, и ваш компилятор, похоже, работает неправильно. Вы можете увидеть, как gcc обрабатывает его здесь: http://ideone.com/MI9gz

Его сообщение об ошибке:

prog.cpp:4:4: error: reference to 'vector' is ambiguous
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/stl_vector.h:171:5: error: candidates are: class std::vector<char> std::vector<char>::vector
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/stl_vector.h:171:5: error:                 class std::vector<int> std::vector<int>::vector