模板构造函数继承的标准符合语法是什么?

Nik*_*s R 10 c++ constructor using-statement c++11

GCC 4.8.1接受

template <typename T>
class Subclass : public Baseclass<T>
{
public:
    using typename Baseclass<T>::Baseclass;
};
Run Code Online (Sandbox Code Playgroud)

但MSVC没有.另一方面,MSVC接受

template <typename T>
class Subclass : public Baseclass<T>
{
public:
    using typename Baseclass::Baseclass;
};
Run Code Online (Sandbox Code Playgroud)

但海湾合作委员会没有.然后我在这个问题中看到了另一种声明:c ++ 11继承模板构造函数

template <typename T>
class Subclass : public Baseclass<T>
{
public:
    using typename Baseclass::Baseclass<T>;
};
Run Code Online (Sandbox Code Playgroud)

海湾合作委员会表示,MSVC警告称"过时的申报风格"

prog.cpp:8:24: error: ‘template<class T> class Baseclass’ used without template parameters
        using typename Baseclass::Baseclass<T>;
Run Code Online (Sandbox Code Playgroud)

我认为第一个例子是标准的符合语法.直观地说,它对我来说是正确的.

什么是c ++ 11标准符合语法?

use*_*011 3

答案有点隐藏在标准中。using 声明定义为 (7.3.3):

using [typename] nested-name-specifier unqualified-id;
Run Code Online (Sandbox Code Playgroud)

nested-name-specifier经过一些步骤后的解析被simple-template-id定义为

template-name < [template-argument-list] >
Run Code Online (Sandbox Code Playgroud)

简而言之,标准一致的语法是

template <typename T>
class Subclass : public Baseclass<T>
{
public:
    using typename Baseclass<T>::Baseclass;
};
Run Code Online (Sandbox Code Playgroud)