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

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?

10

Решение

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

Другие решения


По вопросам рекламы [email protected]