【发布时间】: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<T>应该适用于BaseClass本身不是类模板但具有构造函数模板的情况。 -
你必须检查标准,但我很确定特殊成员函数是从不继承的。它们可以由编译器在派生类中按照生成它们的常规规则自动声明。
-
嗯?为什么会有
Baseclass和BaseClass? -
是的,
Base::Base(int)当然会被继承,但这既不是默认值也不是复制构造函数。请参阅 [class.inhctor]/3,其中指出默认和复制/移动构造函数被排除在候选继承构造函数集中。 -
我很确定这里继承构造函数的正确方法是
using Baseclass<T>::Baseclass;,而不是typename,并提供::左侧的模板参数(至少)。
标签: c++ c++11 constructor using-statement