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

时间:2017-03-02 21:40:14

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

当我尝试在GCC上编译我的程序并且有兴趣知道如何使用C ++ 11的初始化语法e.g. struct { int a; int b} my_struct {1, 2}来移植初始化继承的POD结构时,我遇到了一个问题。使用以下代码可以最小化地解决问题,这些代码在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>没有任何字段'base'。所以我尝试以下更改。

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

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

GCC现在将base<A>识别为derived<A>的字段,但声明a未在此范围内声明。

有趣的是,这个更改现在不能在MSVC上编译并声明“'{':缺少函数头(旧式正式列表?)”。

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

感谢。

2 个答案:

答案 0 :(得分:0)

这使您的上一个示例有效:

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

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

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

答案 1 :(得分:0)

C ++ 17将以某种形式支持这一点:

表格aggregate_initialization:

  

每个直接公共库,(自C ++ 17)数组元素或非静态类成员,按照类定义中的数组下标/外观的顺序,从初始化列表的相应子句进行复制初始化。

// aggregate
struct base1 { int b1, b2 = 42; };
// non-aggregate
struct base2 {
  base2() : b3(42) {}
  int b3;
};
// aggregate in C++17
struct derived : base1, base2 { int d; };
derived d1{ {1, 2}, { }, 4}; // d1.b1 = 1, d1.b2 = 2,  d1.b3 = 42, d1.d = 4
derived d2{ {    }, { }, 4}; // d2.b1 = 0, d2.b2 = 42, d2.b3 = 42, d2.d = 4

同时标准方式是:

template <typename A>
    derived<A>::derived()  {
        this->a = 1;
}