我尝试在visual studio 2013(社区版)中编译一些代码,但我遇到了问题:以下代码拒绝编译。
struct X
{
X(double y);
};
typedef X Z;
struct Y : public Z
{
using Z::Z;
};
问题是使用Z :: Z的行。它给了我一个错误C2039:'Z':不是'X'的成员
这段代码有效吗?或者这是一个错误?
答案 0 :(得分:5)
您正在使用的功能是继承构造函数,而不是委派构造函数。并且根据MSDN,VS 2013不支持继承构造函数RTM。
VS 2013 支持支持委托构造函数,但这是一个不同的功能 - 一个构造函数将成员初始化委托给另一个。这将是一个例子:
struct X
{
int i;
X(int i) : i(i) {}
X() : X(42) {} // delegating constructor
};
如果你需要在不支持它的编译器中继承构造函数,你可以通过定义一个完美的转发构造函数来创建一个变通方法。它没有100%同样的效果,但对于大多数用途它应该足够好了:
struct Y : X
{
template <class... Arg>
Y(Arg &&... arg) : X(std::forward<Arg>(arg)...) {}
};
它不具有与基类构造函数相同的noexcept
特性,但是再次,VS 2013不支持noexcept
。