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

Каков стандартный синтаксис соответствия для наследования конструктора шаблонов?

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 этого не делает. Затем я видел еще одно объявление в следующих вопросах: С++ 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>;

Я думал, что первым примером будет стандартный синтаксис соответствия. Интуитивно, это выглядит правильно для меня.

Что такое синтаксис стандартного соответствия С++ 11?

4b9b3361

Ответ 1

Ответ немного похож на стандарт. Объявление использования определяется как (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;
};