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

时间:2014-09-19 18:36:28

标签: c++ c++11 constructor using-statement

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;
};

但海湾合作委员会没有。然后我在这个问题中看到了另一种声明:c++11 inheriting template constructors

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标准的语法?

1 个答案:

答案 0 :(得分:2)

答案有点埋没在标准中。使用声明定义为(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;
};
相关问题