вопросы инициализаторов нестатических элементов данных - PullRequest
14 голосов
/ 06 октября 2011

Я собрал MinGW из транковой версии GCC-4.7.0: http://code.google.com/p/mingw-builds/downloads/list

В описании изменений этой версии говорится, что реализованы нестатические инициализаторы элементов данных: http://gcc.gnu.org/gcc-4.7/changes.html

http://www.open -std.org / ОТК1 / SC22 / WG21 / документы / документы / 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: note: 'std :: string (type :: ) (int) {aka std :: basic_string (type :: ) (int)} 'не является производным от' const std :: basic_string <_CharT, _Traits, _Alloc> 'main.cpp: 16: 35: note: не удалось разрешить адрес из перегруженной функции 't.type :: s'

Но, согласно документации, код правильный.

Ответы [ 2 ]

14 голосов
/ 06 октября 2011

Кажется, что проблема заключается в двусмысленности в определении, объявляете ли вы функцию или объект, а компилятор выбирает функцию.

Вы должны попробовать инициализировать строку, используя вместо этого следующий синтаксис:

std::string s = "string";

Если мы перейдем по ссылке из Замечаний к выпуску GCC, касающихся инициаторов нестатических элементов данных ( предложение N2756 ), они упомянут об этом в проблеме 1 с примечанием к этой резолюции:

CWG провела в Коне опрос «6 к 3» в пользу поиска в классе; и это то, что предлагает эта статья, с инициализаторами для нестатических члены данных ограничены «= initializer-clause» и «{ список инициализаторов} ”формы.

0 голосов
/ 20 октября 2014

Элемент данных должен быть инициализирован инициализаторами скобок или равных. Посетите http://www.open -std.org / JTC1 / SC22 / WG21 / docs / documents / 2008 / n2756.htm

8.5 Инициализаторы [dcl.init]

Изменить грамматику для инициализатора:

инициализатор:

= (  expression-list  )

скобка или равно-инициализатор:

=  initializer-clause

   braced-init-list
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...