【发布时间】:2017-03-02 21:40:14
【问题描述】:
当我尝试在 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 上编译,并指出“'{': missing function header (old-style form list?)”。
此时我不知道如何以符合标准的方式编写此代码。
谢谢。
【问题讨论】:
-
它在我的 VS15 上编译......
-
...但不是他的最后一个示例,这仅在 VS15 中将
: base<A>替换为: base时有效。 -
我说的是
base<A>的最后一个例子。 (VS15 更新 3) -
@ZivS 嗯,这很奇怪。 MVSC15 是否无法为我以外的其他人编译
base<A>版本? -
重新使用
this->a与仅使用a,参见 stackoverflow.com/questions/1120833/…。
标签: c++ inheritance gcc visual-c++ portability