2017-02-07 6 views
1

В основном файле для тестирования я начал с кода, подобного этому.Ошибка: переменная Не объявлена ​​в этой области

//Initialize the data type for the vectors and input variables 
if (choice == 1) 
{ 
    vector<int>MyVector{}; 
    vector<int>NewVect{}; 
    int k1{}, k2{}; 
} 

else if (choice == 2) 
{ 
    vector<float>MyVector{}; 
    vector<float>NewVect{}; 
    float k1{}, k2{}; 
} 
//Exact Same block for double 
while (true) 
{ 
    cout<<": "; 
    cin>>k1>>k2; 
    if ((k1 == 0) && (k2 == 0)) break; 
    else 
    { 
      MyVector.push_back(k1); 
      MyVector.push_back(k2); 
      continue; 
    } 
    } 
//Insert Sort Algorithm test, Imported from class InsertSort. 
//NewVector = sort.sort(MyVector) 
return 0;  
} 

Он по-прежнему, как это в двух других еще, если заявления об объявлении поплавок и двойной соответственно (используя те же имена переменных). Однако компиляция останавливается и говорит, что k1, k2, MyVector и NewVector не были объявлены в этой области дальше в программу. Я объявил это в «глобальной» части основного, поэтому я не понимаю, почему декларация не происходит. Невозможно попытаться объявить одну и ту же переменную другого типа внутри if/else if statement?

Я пытаюсь сделать это таким образом, чтобы избежать дополнительных тестов во входном цикле, таким образом, существует одна проверка для типа данных, определены правильные типы данных, а код будет короче, чем это было бы , Любые идеи, что происходит?

EDIT: Code Added.

+0

Это может быть из-за предыдущую ошибку синтаксического анализа. Вы внимательно проверили? Комментируйте часть кода. –

+0

Переменные существуют только в пределах выражения 'if', потому что именно там вы их объявили. – acraig5075

+2

Пожалуйста, предоставьте [MCVE] (http://stackoverflow.com/help/mcve), потому что подробности здесь. Дикая догадка: переменные в C++ «видны» только в ближайшей области, т. Е. В вашем фрагменте ни одна из переменных не будет видна вне соответствующей ветви 'if'. – yeputons

ответ

1

Вы не можете объявить переменную, которая Тип зависит от состояния времени выполнения. Типы переменных объявляются/указаны во время компиляции. Зная это, вы пытались объявить разные типы внутри блоков if, но тогда объем каждой переменной ограничивается блоком, в котором он объявлен.

То, что вы пытаетесь может быть достигнуто с помощью какой-то полиморфной переменной или переменной любого типа, который будет доступен в C++17, но не раньше, под названием std::any. В то же время вы можете попытаться сделать для себя что-то подобное, используя unions. Далее может обеспечить стартовый пример, чтобы сделать свой собственный any тип, пример определяет any, который содержит либо int или ее double:

#include <iostream> 
#include <vector> 

struct any { 
    union { int intVal = 0; double dblVal;}; 
    enum {Int = 1, Dbl = 2} type = Int; 

    any(int val) : intVal(val) {type = Int;} 
    any(double val) : dblVal(val) {type = Dbl;} 
    any() {} 
}; 

std::ostream& operator <<(std::ostream& os, const any& x) { 
    switch(x.type) { 
     case any::Int : os << x.intVal; break; 
     case any::Dbl : os << x.dblVal; break; 
    } 
    return os; 
} 
int main() 
{ 
    std::vector<any> vect; 
    any k1, k2; 

    vect.emplace_back(3); 
    vect.emplace_back(4); 
    vect.emplace_back(9.5); 
    vect.emplace_back(10.5); 

    for (const auto& i: vect) 
     std::cout << i << " "; 
} 
+1

Вы поняли, что я пытаюсь сделать. Однако ваш код немного над моей головой. Я понимаю, что существует «класс», который используется, но объединение незнакомо мне, а синтаксис перегрузки оператора по-прежнему очень чуждо и таинственен. Я проведу его и посмотрю, смогу ли я заставить его работать в этом контексте и лучше понять его. –

+0

@SuperUser_Novice Я это понимаю.В принципе, объединение - это поле, которое может содержать один из типов, которые вы хотите, чтобы ваша переменная удерживалась, а в поле перечисления типа «тип» хранится «тип» времени выполнения переменной в соответствии с тем, что вы ей назначили. Это то, что вы хотели сделать с переменной 'choice'. –

+0

как для '<<' перегрузки, не волнуйтесь за это, вы можете сделать сам тест на 'type' при выводе переменной типа' any'. Перегрузка обычно делается для инкапсуляции этого кода в одном месте. –

0

Похоже, что переменные определены внутри оператора if. Если вы хотите использовать эти переменные после окончания инструкции if, вам необходимо объявить их перед оператором if.

0

пытаются поставить k1 ​​и k2 из если условие

int k1{}, k2{}; 
if (choice == 1) 
{ 
vector<int>Myvector{}; 
vector<int>NewVect{}; 
}  

всегда пытаются объявить переменную раньше, если заявление