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

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

但是 GCC 没有。然后我在这个问题中看到了另一种声明: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 标准的语法?

最佳答案

答案有点隐藏在标准中。 using 声明定义为 (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;
};

关于c++ - 模板构造函数继承的标准符合语法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25940365/

相关文章:

c++ - 从函数返回一个 unique_ptr vector

c++ - 用于自由函数包装器的 SFINAE 技术

android - 错误 : use of overloaded operator '[]' is ambiguous

c++ - 尝试在结构中接收模板并将其用于 std::vector

c++ - 为什么我们需要为 lambda 中的引用捕获引用?

c++ - 如何在类中使用 char*

javascript - 以特定顺序执行链中的一系列方法

c++ - 成员变量不保存从函数成员添加到它的值

c++ - sql参数的最佳STL容器

c++ - char* 数组的问题