В первом абзаце [class.derived] говорится о спецификаторах базового класса:
Если найденное имя не является именем класса, программа неправильно сформирована.
Однако простой тест показывает, что Comeau и g++ -ansi -pedantic
оба принимают typedef-name в качестве основы. Простой grep -r '[^:]: mpl'
над заголовками Boost показывает, что популярная библиотека часто использует такое поведение.
Отклонял ли когда-нибудь компилятор typedef
класса в базовом спецификаторе? GCC даже проверяет, что тип базового класса не const
, что уточняет нестандартную функциональность.
Есть ли обходной путь? Единственное, что я могу придумать, это заменить typedef шаблоном псевдонима C++11. Шаблонное объявление-псевдоним объявляет имя-шаблона, которое затем может стать именем класса… Я думаю. Для этого может потребоваться фиктивный параметр для объявления псевдонима.
Возможно, Стандарт следует скорректировать, чтобы он соответствовал единодушному поведению компиляторов. ДР есть?