当我尝试在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上编译并声明“'{':缺少函数头(旧式正式列表?)”。
此时我不知道如何以符合标准的方式编写它。
感谢。
答案 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将以某种形式支持这一点:
每个直接公共库,(自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;
}