非静态数据成员初始化者问题

时间:2011-10-06 12:40:09

标签: c++ c++11

我已经从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'

中的地址

但根据文档,代码是正确的。

2 个答案:

答案 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