当我试图在 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/