GCC 4.8.1 принимает
template <typename T>
class Subclass : public Baseclass<T>
{
public:
using typename Baseclass<T>::Baseclass;
};
но MSVC нет. С другой стороны, MSVC принимает
template <typename T>
class Subclass : public Baseclass<T>
{
public:
using typename Baseclass::Baseclass;
};
но GCC нет. Тогда я видел другой вид декларации в этих вопросах: c ++ 11 наследует конструкторы шаблонов
template <typename T>
class Subclass : public Baseclass<T>
{
public:
using typename Baseclass::Baseclass<T>;
};
за что MSVC предупреждает о «устаревшем стиле объявления», а GCC говорит
prog.cpp:8:24: error: ‘template<class T> class Baseclass’ used without template parameters
using typename Baseclass::Baseclass<T>;
Я думал, что первым примером будет стандартный синтаксис соответствия. Интуитивно, это выглядит правильно для меня.
Что такое синтаксис соответствия стандарту c ++ 11?
Ответ немного похоронен в стандарте. Объявление использования определяется как (7.3.3):
using [typename] nested-name-specifier unqualified-id;
nested-name-specifier
разрешается после нескольких шагов в simple-template-id
который определяется как
template-name < [template-argument-list] >
Короче говоря, стандартный соответствующий синтаксис
template <typename T>
class Subclass : public Baseclass<T>
{
public:
using typename Baseclass<T>::Baseclass;
};