2011-10-06 21 views
13

he construido MinGW del tronco-versión de GCC-4.7.0: http://code.google.com/p/mingw-builds/downloads/listno estáticos miembros de datos Inicializadores preguntas

En la descripción de los cambios de esta versión se dice que los inicializadores de miembros de datos no estáticos se implementan : http://gcc.gnu.org/gcc-4.7/changes.html

http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2008/n2756.htm

Cuando intento compilar un ejemplo:

#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; 
} 

consigo un montón de errores, y éste es en el final:

main.cpp: 16: 35: nota: 'std :: string (tipo :: ) (int) {aka std :: basic_string (tipo ::) (int)} 'no se deriva de' const std :: basic_string < _CharT, _Traits, _Alloc> 'main.cpp: 16: 35: nota: no se pudo resolver la dirección de sobrecargado función 't.type :: s'

Pero de acuerdo con la documentación, el código es correcto.

+4

No tengo instalado GCC 4.7 para probarlo y mi versión no admite la inicialización de miembros, pero ¿la compila con -std = C++ 0x? – Griwes

+0

Tenga en cuenta que los inicializadores de miembros son nuevos en GCC 4.7, por lo que debería ser un error simple del compilador. –

+0

a Griwes: sí. – niXman

Respuesta

14

El problema parece ser una ambigüedad al determinar si está declarando una función o un objeto, y el compilador elige la función.

usted debe intentar inicializar la cadena usando esta sintaxis en su lugar:

std::string s = "string"; 

Si seguimos el enlace desde el CCG Notas relativas a los inicializadores de miembros de datos no estáticos (proposal N2756), mencionan esto en el problema 1, con esta nota de resolución:

CWG tenía una encuesta de paja de 6 a 3 en Kona a favor de la búsqueda de alcance de clase; y eso es lo que propone este documento, con inicializadores para los datos no estáticos miembros de datos limitados a los formularios "= initializer-clause" y "{ initializer-list}".

+0

¿Esto significa que 'std :: string s (" string ");' es una declaración de función válida? ¿Puedes explicar cómo debería interpretarlo? –

+3

¿Esto también funciona para los constructores que son 'explicit'?De cualquier manera, probablemente prefiera 'std :: string s {" string "};'. –

+0

@ Björn: No es una declaración válida. Si fuera una declaración de función válida, no habría error de compilación. –

Cuestiones relacionadas