C++11 委托(delegate)构造函数和 typedef

标签 c++ c++11 visual-studio-2013

我尝试在 visual studio 2013(社区版)中编译一些代码,但我遇到了问题:以下代码拒绝编译。

struct X
{
    X(double y);
};

typedef X Z;
struct Y : public Z
{
    using Z::Z;            
};

问题是使用 Z::Z 的行。它给我一个错误 C2039: 'Z' : is not member of 'X'

此代码有效吗?或者这是一个错误?

最佳答案

您使用的功能是继承构造函数,不是委派构造函数。并且根据MSDN , VS 2013 RTM 不支持继承构造函数。

VS 2013 确实支持委托(delegate)构造函数,但这是一个不同的功能——一个构造函数将成员初始化委托(delegate)给另一个构造函数。这将是一个例子:

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

关于C++11 委托(delegate)构造函数和 typedef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28929989/

相关文章:

c++ - 如何在 C++ 中删除集合或如何将集合的大小调整为 0

c++ - 我可以使用 vsinstr 检测 exe 文件吗?

visual-studio-2013 - 安装 Resharper 后 Bing 代码搜索不工作

c++ - Qt QPainter 以毫米而不是英寸为单位

c++ - C++ 中的简单 'database'

c++ - 删除 vector vector C++ 中的 vector

c# - VS 2013/2015 代码分析——抑制来自第三方库的警告

c++ - 在 QtCreator 中查看数组内容

c++ - 如何将仿函数用作类模板中的成员?

c++ - 在 C++ 中移动 const 和重载通用引用