c++ - 如何在派生类中可移植地初始化继承的模板化 POD 结构?

标签 c++ inheritance gcc visual-c++ portability

当我试图在 GCC 上编译我的程序时遇到了一个问题,我很想知道如何使用 C++11 的初始化语法可移植地初始化一个继承的 POD 结构 e.g. struct { int a; int b} my_struct {1, 2} .该问题可以用以下在 MSVC 上编译良好的代码最低限度地表示。

#include <iostream>

template <typename A>
struct base {
 A a;
};

template <typename A>
class derived : public base<A> {
public:
  derived();
};

template <typename A>
derived<A>::derived() : base {1} {

  std::cout << "Constructed " << a << std::endl;
}

int main() {
  derived<int> d1;
}

但是,启用了 C++14 的 GCC 大致表明 derived<A>没有任何字段“基础”。所以我尝试了以下更改。

template <typename A>
derived<A>::derived() : base<A> {1} {

  std::cout << "Constructed " << a << std::endl;
}

GCC 现在可以识别 base<A>作为derived<A>的领域很好,但是声明 a未在此范围内声明。

有趣的是,此更改现在无法在 MSVC 上编译并显示“'{':缺少函数头(旧式正式列表?)”。

此时我不知道如何以符合标准的方式编写它。

谢谢。

最佳答案

这使您的最后一个示例有效:

std::cout << "Constructed " << this->a << std::endl;

演示:http://coliru.stacked-crooked.com/a/fe9715a447ffbea1

起初我无法在 MSVC++ 2015 (update 1) 下编译它。安装后 update 3它编译得很好。

关于c++ - 如何在派生类中可移植地初始化继承的模板化 POD 结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42566513/

相关文章:

Java:如何创建一个可以在包内子类化的公共(public)类,同时防止外人继承?

javascript - util.inherits 如何影响原型(prototype)链?

c++ - 未使用的变量和函数的链接器错误

c - 优化级别打破了 C 代码顺序

c++ - Debian 上的 qt ./configure

c++ - 一维谐振子递归函数,可能无限循环,c++ 语法

c++ - 写入二进制文件

c++ - 编译 Thrift 服务器时出错

Javascript 原型(prototype)处理 self 和构造函数参数

linux - 使用 gcc/g++ 时抑制系统调用