【问题标题】:'list' was not declared in this scope'list' 未在此范围内声明
【发布时间】:2016-10-27 14:22:48
【问题描述】:

我是 C++ 新手,我正在尝试获取一个基本程序来初始化一个短无符号整数列表。我正在使用 scygwin 和 g++ 编译和运行。

下面是.cpp文件中的代码:

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <typeinfo>
using namespace std;


int main (int argc, char* argv[]) {

list<int> events;

return 0;
}

我通过在 cygwin 终端中输入以下命令来运行:

$ g++ -o test.out test.cpp

但是,我收到以下编译错误:

test.cpp:在函数“int main(int, char**)”中:test.cpp:16:1:错误: 此范围列表事件中未声明“列表”;
^ test.cpp:16:6:错误:“int”之前的预期主表达式 列出事件; ^

我对为什么 list 不在范围内感到困惑,因为我使用的是命名空间 std?我在 c++ 论坛上发现了一个类似的问题,但我的问题将得到解决。有人知道这是什么问题吗?

-保罗

【问题讨论】:

  • #include
  • 谢谢。但是当我using namespace std 时为什么不自动包含?
  • 当你#include一个文件时,它就像一个文字复制粘贴。你会得到很多隐藏在命名空间 std 中的项目。当您说using namespace std; 时,您实际上并没有导入任何内容,而只是省去了必须在该命名空间中限定项目的麻烦。
  • 为了清楚起见,您是说 隐藏在命名空间 std 中,直到我明确包含它?我想我一直在假设每个 c++ 文件中总是有一个隐含的#include &lt;std&gt;,这将使您可以访问该命名空间中的任何内容。
  • 命名空间不是代码的集合。它只是一个帮助组织代码的命名标签。查看我的更新答案

标签: c++ list namespaces


【解决方案1】:

using namespace std; 不会向您的代码添加任何功能。这只是意味着您在引用 std 命名空间中的内容时不必键入 std::,例如 std::list

要将std::list 的代码库实际包含到您的程序中,您需要添加:

#include <list>

如果对这类事情有疑问,在 Google 上搜索 cpp reference list 会打开类似 this 的页面,您可以在其中看到:Defined in header &lt;list&gt; 在顶部。

这是关于 using namespace std;another questionwhy you shouldn't use it。我会补充一点来解释命名空间。

在 C++ 程序中,将函数组织成类和命名空间是很常见的。想象一下,您编写了自己的 list 类来处理某些场景。为了防止命名冲突,您可以将其放在与std 不同的命名空间中。

namespace MyApp {
    class list;
    void sort(list&);
}

对于大多数大型代码库,您可能仍然更喜欢使用std::list,但在某些情况下您需要MyApp::list。使用命名空间,您可以对代码进行集群并防止类似功能的命名冲突。

总结

using namespace std; 使得如果您引用不在全局命名空间中的函数或类,它会在 std 命名空间中查找它。

#include &lt;list&gt; 实际上在预处理阶段将原型(有关如何访问代码的信息)插入到源文件中。

【讨论】:

  • 好的,这是有道理的。但我还是不明白为什么,如果 list 在 std 库中,我仍然必须明确包含它?
  • 你所有的包含都在标准库中,想法是你只包含你需要的东西
  • @Paul 我添加了更多内容,希望能让您更好地了解using namespace 的作用以及#include &lt;list&gt; 的作用
  • 很好,感谢您的解释。实际上,我认为我的主要困惑甚至更简单,最终由@vu1p3n0x 所说的得到了回答。我没有意识到我通常包含的所有包都在 std 库中,所以我认为 #include 更像是一个导入。
  • 如果您来自 java/c# 背景,我相信两种语言中using 之间的相关性非常相似。 #include 更接近于 java 的 import。对于 C#,我不知道像 import/#include 这样的东西。我能想到的最接近的方法是在 C# 应用程序的链接阶段包含其他库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 2016-08-09
  • 2019-02-17
  • 2021-01-07
  • 2016-06-03
  • 2014-09-11
相关资源
最近更新 更多