【问题标题】:What is the standard conform syntax for template constructor inheritance?模板构造函数继承的标准符合语法是什么?
【发布时间】:2014-11-14 10:17:49
【问题描述】:

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

【问题讨论】:

  • 什么 MSVC 版本? VS2013 不支持继承构造函数。 AFAIK,第一个是正确的语法。 using Baseclass::BaseClass&lt;T&gt; 应该适用于 BaseClass 本身不是类模板但具有构造函数模板的情况。
  • 你必须检查标准,但我很确定特殊成员函数是从不继承的。它们可以由编译器在派生类中按照生成它们的常规规则自动声明。
  • 嗯?为什么会有BaseclassBaseClass
  • 是的,Base::Base(int) 当然会被继承,但这既不是默认值也不是复制构造函数。请参阅 [class.inhctor]/3,其中指出默认和复制/移动构造函数被排除在候选继承构造函数集中。
  • 我很确定这里继承构造函数的正确方法是using Baseclass&lt;T&gt;::Baseclass;,而不是typename,并提供::左侧的模板参数(至少)。

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


【解决方案1】:

答案有点隐藏在标准中。 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;
};

【讨论】:

  • 在这里使用typename 是没有意义的:你关注的不是基类的注入类名,而是它的构造函数。
猜你喜欢
  • 2012-04-16
  • 2019-12-14
  • 2013-12-02
  • 2013-05-21
  • 1970-01-01
  • 2016-03-04
相关资源
最近更新 更多