我已经从trunk-version GCC-4.7.0构建了MinGW:http://code.google.com/p/mingw-builds/downloads/list
在此版本的更改说明中,可以说实现了非静态数据成员初始值设定项:http://gcc.gnu.org/gcc-4.7/changes.html
http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2008/n2756.htm
当我尝试编译这样一个例子时:
#include <iostream>
#include <string>
struct type {
type()
:i(33)
{}
int i;
std::string s("string");
};
int main() {
type t;
std::cout << t.i << " : " << t.s << std::endl;
}
我收到了很多错误,最后这个错误:
main.cpp:16:35:注意:'std :: string(type :: )(int){aka std :: basic_string(type :: )(int)}'不是从'const派生的 std :: basic_string&lt; _CharT,_Traits,_Alloc&gt;' main.cpp:16:35:注意: 无法解决重载函数't.type :: s'
中的地址
但根据文档,代码是正确的。
答案 0 :(得分:14)
在确定是否声明函数或对象时,问题似乎是模棱两可,编译器正在选择函数。
您应该尝试使用以下语法初始化字符串:
std::string s = "string";
如果我们按照GCC发行说明中关于非静态数据成员初始值设定项(proposal N2756)的链接,他们会在问题1中提及此问题,并使用此解决方案注意:
CWG在Kona进行了6比3的民意调查,支持分类范围查询; 这就是本文提出的,非静态的初始化器 数据成员仅限于“= initializer-clause”和“{ initializer-list}“表格。
答案 1 :(得分:0)
必须通过大括号或等号初始化程序初始化数据成员。 访问http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2008/n2756.htm
8.5初始值设定项[dcl.init]
更改初始化程序的语法:
初始化:
= ( expression-list )
撑 - 或等于初始值设定:
= initializer-clause
braced-init-list