user5954772
user5954772

Reputation:

Error: Variable Not declared in this scope

In the main file for testing I started with code similar to this.

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

It continues like this into two other else if statements declaring float and double respectively ( using the same variable names ). The compilation however stops and says that k1, k2, MyVector, and NewVector were not declared in this scope further into the program. I declared it within the "global" portion of main so I'm not really understanding why the declaration isn't happening. Is it not possible to try to declare the same variable of a different type within if/else if statements?

I'm trying to do it this way to avoid additional tests within the input loop, that way there is one check for the data type, the proper data types are defined and the code will be shorter than it would have been. Any ideas what's happening?

EDIT: Code Added.

Upvotes: 1

Views: 2814

Answers (3)

A.S.H
A.S.H

Reputation: 29352

You cannot declare a variable which's type depends on a run-time condition. Types of variables are declared/specified at compile time. Knowing that, you tried to declare different types inside the if blocs, but then, the scope of each variable is limited to the bloc in which it is declared.

What you are trying can be achieved using some kind of polymorphic variable, or variable of any type, which will be available in C++17 but not before, under the name of std::any. In the mean time, you can try to make for yourself something similar using unions. The following can provide a starting example to making your own any type, the example defines an any that holds either an int or a 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 << "  ";
}

Upvotes: 1

Mehtab Ansari
Mehtab Ansari

Reputation: 1

try to put k1 and k2 out of if condition

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

always try to declare variable before if statement

Upvotes: 0

ScegfOd
ScegfOd

Reputation: 402

It looks like the variables are only defined inside an if statement. If you want to use those variables after the end of the if statement, you need to declare them before the if statement.

Upvotes: 0

Related Questions