2017-01-01 7 views
0

C++. Можно ли сделать это?C++. можно сделать это, не получив ошибки: 'не был объявлен в этой области'

if (x>3) 
int foo=10 
else 
long foo=10 

без получения ошибки:

was not declared in this scope

+0

Что вы пытаетесь сделать? Есть конкретная проблема? – DeiDei

+2

Пожалуйста, покажите код, генерирующий эту ошибку. – ChiefTwoPencils

+3

Вы ** не можете ** делать то, что предлагаете. Объем переменных - это 'if' и' else' соответственно. Переменные строго типизированы в каждой области на C++ - вы пытаетесь это сломать. Вероятно, это вопрос [xy] (http://mywiki.wooledge.org/XyProblem). – kabanus

ответ

8

Да, вы можете, используя std::variantC++17 или boost::variant.

std::variant<int, long> foo; 

if(x > 3) 
    foo = 10; 
else 
    foo = long(10); 

И тогда доступ foo так:

if(auto value = std::get_if<int>(&foo)) 
    std::cout << "foo is int: " << *value << '\n'; 
else { 
    long value = std::get<long>(foo); 
    std::cout << "foo is long: " << value << '\n'; 
} 

Я не знаю, почему вы хотели бы сделать это, хотя. A long будет иметь возможность хранить все значения int, поэтому вы можете просто сделать foo типа long и вообще избежать std::variant. не

+1

Хороший ответ, узнал что-то. Не совсем то, что он спрашивает, но, вероятно, что он имел в виду. – kabanus

2

нет вы не можете, потому что переменная x является областью видимости внутри, если блок, так что вы не можете видеть его снаружи:

int main() 
{ 
    if(!x) 
     int value = 100; 
    else 
     double value = 5.57; 

    cout << value << endl; // values is scoped to if statement or else's so it will be destructed 

    // this example is like what you have above 
    for(;;) 
    { 
     int a = 77; 
     if(a) 
      break; 
    } 

    cout << a << endl; // error a is undeclared identifier 

    return 0; 
}