Ошибка C2361: инициализация "найденного" пропускается по метке "по умолчанию"

Возможный дубликат:
Почему переменные не могут быть объявлены в инструкции switch?

У меня есть странная ошибка в моем коде ниже:

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

Компилятор Visual Studio 2010 говорит, что:

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'

Я думаю, что я правильно написал инструкции break и default, поэтому где ошибка?

Ответ 1

Вам нужно либо приложить case 'f': к скобке с расширенными возможностями:

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

или поместите объявление found вне switch

Ответ 2

Семантикой a switch являются те из goto: case do not ввести новый масштаб. Таким образом, found доступен в вашем случае default: (хотя вы на самом деле не обращаетесь к нему). Прыжки по нетривиальному инициализация является незаконной, поэтому ваш код становится незаконным.

Учитывая сложность вашего case 'f':, лучшим решением является, вероятно, чтобы разделить его на отдельную функцию. В противном случае вы можете весь случай в {...}, создавая отдельный объем или инициализация, запись:

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

(Я упомянул об этом для полноты. Это не решение, которое я бы рекомендую.)

Ответ 3

Вам нужно объявить внутренние переменные switch case в фигурных скобках. то есть.

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