Неоднозначное введенное имя класса не является ошибкой
То, что я прочитал в стандарте С++ о введенных именах классов, противоречит (как я вижу) с поведением примерной программы, которую я представлю в ближайшее время. Вот что я читал:
-
Из 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
Ответы
Ответ 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