trackid tag manager instalar gtm google create c++ compiler-errors switch-statement

c++ - instalar - google tag manager trackid sp 006



error C2361: la inicialización de ''encontrado'' se omite en la etiqueta ''por defecto'' (3)

Posible duplicado:
¿Por qué no se pueden declarar las variables en una sentencia de cambio?

Tengo un error extraño en mi código de abajo:

char choice=Getchar(); switch(choice) { case ''s'': cout<<" display tree "; thetree->displaytree(); break; case ''i'': cout<<" enter value to insert "<<endl; cin>>value; thetree->insert(value); break; case ''f'' : cout<< "enter value to find "; cin>>value; int found=thetree->find(value); if(found!=-1) cout<<" found = "<<value<<endl; else cout<< " not found " <<value <<endl; break; default: cout <<" invalid entry "<<endl;; }

El compilador de Visual Studio 2010 dice que:

1>c:/users/daviti/documents/visual studio 2010/projects/2-3-4/2-3-4/2-3-4.cpp(317): error C2361: initialization of ''found'' is skipped by ''default'' label 1> c:/users/daviti/documents/visual studio 2010/projects/2-3-4/2-3-4/2-3-4.cpp(308) : see declaration of ''found''

Creo que he escrito correctamente las declaraciones de ruptura y por defecto, entonces, ¿dónde está el error?


Debe declarar las variables internas del case del switch entre llaves. es decir

case ''f'' : { ... int found=thetree->find(value); ... }


La semántica de un switch es la de un goto : los case no introducen un nuevo alcance. Por lo tanto, se found accesible en su default: caso (aunque en realidad no lo tiene). Saltar sobre una inicialización no trivial es ilegal, por lo que su código se convierte en ilegal.

Dada la complejidad de su case ''f'': la mejor solución es probablemente factorizarla en una función separada. Si falla, puede poner el caso completo en {...} , creando un alcance separado, o renunciar a la inicialización, escribiendo:

int found; found = thetree->find(value);

(Menciono esto para completar. No es la solución que recomendaría).


Usted necesita encerrar su case ''f'': con una abrazadera de alcance:

case ''f'' : { cout<< "enter value to find "; cin>>value; int found=thetree->find(value); if(found!=-1) cout<<" found = "<<value<<endl; else cout<< " not found " <<value <<endl; break; }

O coloque la declaración de found fuera del switch