2017-02-07 58 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;  
} 

它继续这样到其他两个else if语句分别声明float和double(使用相同的变量名)。然而,编译停止并且说k1,k2,MyVector和NewVector没有在此范围内进一步声明为该程序。我在main的“全局”部分声明了它,所以我并不真正理解为什么声明没有发生。是否可以尝试在if/else if语句中声明不同类型的相同变量?

我试图这样做,以避免在输入循环内进行额外的测试,这种方式有一个数据类型检查,正确的数据类型定义和代码会比它会更短。有什么想法发生了什么?

编辑:代码添加。

+0

这可能是由于先前的解析错误。你仔细检查过吗?评论部分的代码。 –

+0

变量只存在于“if”语句的范围内,因为这是您声明它们的地方。 – acraig5075

+2

请提供[MCVE](http://stackoverflow.com/help/mcve),因为这里的细节很重要。狂猜:C++中的变量只在最接近的范围内“可见”,即在你的代码段中,在相应的“if”分支之外,任何变量都不可见。 – yeputons

回答

1

你不能声明一个变量,它的类型取决于运行时的状态。变量的类型是在编译时声明/指定的。知道这一点,你试图在if语句块中声明不同的类型,但是,每个变量的范围仅限于声明它的块。

你正在尝试可以使用某种多态变量,或任何类型的变量,这将是C++17可用,但在此之前,中std::any名义来实现。同时,您可以尝试使用unions来为自己制作类似的东西。下面可以提供一个启动例子来使自己的any类型,例如定义或者持有的intanydouble

#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我明白这一点。基本上,联合是一个字段,可以容纳你希望变量保持的类型之一,并且'type'枚举字段根据分配给它的变量保存变量的运行时“类型”。这就是你想用你的“choice”变量做的事情。 –

+0

至于'''重载,不用担心,你可以在输出'any'类型的变量时自己对'type'进行测试。通常会将重载封装在一个地方。 –

0

看起来变量只在if语句中定义。 如果要在if语句结束后使用这些变量,则需要在if语句之前声明它们。

0

尽量把k1和k2出来的,如果条件

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

总是试图声明变量之前if语句