C++“未在此范围内声明”

C++ "was not declared in this scope"

提问人:Sweep 提问时间:6/16/2023 最后编辑:JaMiTSweep 更新时间:6/16/2023 访问量:648

问:

嘿嘿,基本上我写这个简单的函数来问你有多少辆车,在数组中输入数量,并将汽车的名称也分配给数组。还制作了一个 for 循环来显示它,它说它没有在范围内声明,我只是不明白为什么它这么说。有人可以帮我吗?

error:           project2.cpp:13:16: error: 'cars' was not declared in this scope
   13 |         cin >> cars[i];
      |                ^~~~
project2.cpp:17:17: error: 'cars' was not declared in this scope
   17 |         cout << cars[i];
#include <iostream>
#include <string>
void display(){
    int amount;
    cout << "Car amount: ";
    cin >> amount;
    string cars[amount];
    for(int i=0; i<amount; i++){
        cout << "Enter " << i << " car name:";
        cin >> cars[i];
        '\n';
    }
    for(int i=0; i<amount; i++){
        cout << cars[i];
    }

}
using namespace std;
int main()
{
    
    display();


    return 0;
}
c++ compiler-errors 作用域 命名空间 using 指令

评论

2赞 HolyBlackCat 6/16/2023
添加确切的错误消息。
4赞 Thomas Weller 6/16/2023
您正在使用 C++ 中的 VLA。VLA 不是标准 ISO C++。编写正确的 C++ 并改用数组是如此......繁琐且容易出错。std::vector<std::string>
1赞 Richard Critten 6/16/2023
Here you go (with 1 don't do this change) - live - godbolt.org/z/18GehP4cz - 可变长度数组不是 C++ 的一部分。string cars[amount];
1赞 Thomas Weller 6/16/2023
它是 , 不是 , , 不是 .std::coutcoutstd::stringstring
3赞 tadman 6/16/2023
'\n';在一条线上,它本身绝对不做任何事情。

答:

1赞 Vlad from Moscow 6/16/2023 #1

问题是 using 指令放在 main 之前

using namespace std;
int main()
{
    
    display();


    return 0;
}

其中两个名称都不使用命名空间中的名称。另一方面,您使用的是在放置在 using 指令之前的函数中的标准命名空间中的名称。stdstddisplay

void display(){
    int amount;
    cout << "Car amount: ";
    cin >> amount;
    string cars[amount];
    for(int i=0; i<amount; i++){
        cout << "Enter " << i << " car name:";
        cin >> cars[i];
        '\n';
    }
    for(int i=0; i<amount; i++){
        cout << cars[i];
    }

}

所以名称例如,找不到。至少应该将 using 指令放在函数定义之前。coutcinstring

注意可变长度数组作为函数中使用的数组

    string cars[amount];

不是标准的 C++ 功能。

请改用容器,例如std::vector<std::string>

std::vector<std::string> cars( amount );

要使用容器,您需要包含 header 。<vector>

还有这个表达式语句

'\n';

没有效果。删除它。

相反,你可以写例如

for(int i=0; i<amount; i++){
    cout << "Enter " << i << " car name:";
    cin >> cars[i];
}

cout << '\n';

for(int i=0; i<amount; i++){
    cout << cars[i] << '\n';
}

通常,在全局命名空间中使用 using 指令是一个坏主意。最好使用限定名称,例如

    std::cout << "Car amount: ";

等等。

评论

0赞 Sweep 6/16/2023
我添加了矢量容器,但它仍然显示 project2.cpp:11:21:错误:“汽车”未在此范围内声明 11 |vector <string> cars(amount);
0赞 Sweep 6/16/2023
#include < iostream> #include <cmath> #include <string> #include <stdlib.h> #include <time.h> #include <vector> void display(){ int amount; cout << “汽车金额: ”;CIN >>量;vector <string> cars(amount);for(int i=0; i<amount; i++){ cout << “Enter ” << i << “ car name:”;Cin >>车[i];} for(int i=0; i<amount; i++){ cout << cars[i]; } }使用命名空间 std;int main() { display(); 返回 0; }
0赞 Vlad from Moscow 6/16/2023
@Sweep 您包含的大多数标头都是冗余的。您需要包含标头 #include < iostream> #include <string> include <vector>。您需要使用限定名称,例如 std::vector<std::string>> cars;并删除 using 指令。
1赞 Ben Voigt 6/16/2023
请注意,在 和 everywhere 之间,一个很好的折衷方案是放在重复使用它们的函数的顶部。using namespace std;std::cinusing std::cin; using std::cout;
0赞 Sweep 6/16/2023
是的,我知道我只是没有删除之前和关于 std::court 和其他所有内容的内容,我认为我不需要使用它,因为我基本上是一个初学者,所以我并没有真正制作巨大的股票。使用命名空间 std 对我来说更快、更简单,而且以我的技能水平,它现在效果很好。
1赞 Sc0lapasta 6/16/2023 #2
//new code:
#include <iostream>
#include <string>
#define amount 5 //<---- defines the number of cars in the array
using namespace std;

void display() 
{
    //int amount;
    //cout << "Car amount: ";
    //cin >> amount;
    string cars[amount]; //now, you have a defined number of cars, c++ doesnt allow to use a variables as lenght of array

    for (int i = 0; i < amount; i++) 
    {
        cout << "Enter " << i + 1 << " car name:" << endl; //added endl instead of \n
        //                      ^more undestandable as it starts from 1 instead of 0
        cin >> cars[i];
        //'\n'; doesnt work like this, it need to be used in a string as single character, like "\ncars"
    }
    for (int i = 0; i < amount; i++) 
    {
        cout << cars[i] << " "; //more understandable
    }

}

int main()
{
    display();
    return 0;
}

评论

0赞 Sc0lapasta 6/16/2023
很抱歉,如果我没有按照你的意图做出回应,我用我的了解试图给你最好的回应。我也是 Stack Overflow 的新手,这实际上是我第一次尝试帮助某人编码:)如果我发送给您的代码不起作用(它适用于我的 W11 机器),请告诉我以便我更正它,如果这是您需要的,我也可以告诉自己如何在输入中接收数组的长度。对不起,我的英语不好,我希望我能帮到你。
0赞 Sweep 6/16/2023
这很好,老实说,这是我得到的最好的回应,非常感谢!
3赞 underloaded_operator 6/16/2023
#define amount 5 -> 应为 ,避免使用不必要的宏const int AMOUNT = 5