【问题标题】:foreach not recognized in C++在 C++ 中无法识别 foreach
【发布时间】:2011-01-21 23:18:21
【问题描述】:

在我的 cs106b 书中,我们使用表达式“foreach”来遍历 Map 中的单词列表。我实现了代码并将我的头撞在墙上,面临着神秘的错误。代码如下:

   void DisplayWordCounts(Map<int> & wordsCount) {
     foreach (string word in wordsCount) {
        cout << left << setw(15) << word << right << setw(5)
        << wordsCount[word] << endl;
     }
}

在以“foreach”开头的行中,出现以下错误: 第4课-麦克白/life.cpp:58:错误:“单词”之前的预期主表达式 第 4 课-macbeth/life.cpp:58:错误:“foreach”未在此范围内声明 第 4 课-macbeth/life.cpp:58:错误:预期为“;”在'{'令牌之前

我猜 foreach 无法识别。在这种情况下,我如何浏览 Map 类中的项目列表?

【问题讨论】:

  • 请告诉我们这本书的名字,以便我们更好地避免它。
  • 你想用c++编译c#代码吗?
  • @Everyone- 这是斯坦福大学的入门编程课程 CS106B 和 CS106X 中提供的特殊宏。我们还提供了一个自定义的Map 类,它比STL map 更易于使用;因此大写。
  • @templatetypedef - 感谢您的澄清。在这种情况下,这个问题似乎太本地化了,因为它是针对特定课程的。
  • 你必须质疑合成一个语言中不存在的结构的智慧,而不让学生清楚地知道他们不是在学习 C++,而是为教授编程而发明的一些结构。抽象的意义。此外,由于该结构似乎是直接从 C# 复制的,所以在本课程中使用 C# 有什么问题?

标签: c++ foreach


【解决方案1】:

foreach 不是标准 C++ 功能。这是 Eric Roberts 和我为斯坦福入门编程序列开发的东西,并且早于更现代的 C++11 基于范围的 for 循环。现在 C++11 编译器支持更加广泛,我们已经停止使用 foreach 并选择使用标准 C++ 增强的 for 循环。

我一般不建议继续使用foreach,因为它是非标准的。但是,如果您正在编译使用它的旧代码,则需要包含定义它的 one of the header files from the Stanford C++ Libraries

【讨论】:

  • @Oli Charlesworth- C++ 中的任何内容本身都没有任何问题。主要优点是简单 - 如果您不必引入复杂的迭代器语法来查看 map/set/etc 中的所有内容,则更容易专注于更高级的想法,如递归、链表、图形和渐近分析。课程可能很快会更新以在课程结束时使用 STL 容器,这意味着 foreach 可能会成为简化材料的“训练轮”。
  • 你为什么会做出这么邪恶的事情!?如果您想教授这样的结构,为什么不使用直接支持它的语言。这让我想起了我曾经遇到的那些在现实世界中不得不使用 C 语言的 CS 毕业生,他们会将 #define { 和 } 作为 BEGIN 和 END 以使他们的代码更像 Pascal!
  • @Clifford- 这些课程的目的是让学生快速了解与语言无关的概念,如递归、数据结构、继承等,而不是培养铁杆 C++ 程序员。还有其他课程侧重于 C++ 和其他编程语言的细节。根据经验,这种设置实际上效果很好,因为学生通常会自己学习他们喜欢的语言的细微差别。我不想就此争论不休,因为我认为没有人会改变主意,但你确实有一个很好的观点。
  • C++ 是一个有趣的选择,用于教授数据结构,同时试图忽略特定语言的细节!
  • @templatetypedef:我意识到这一点,但是这个学生似乎没有向 明确这一点,并认为他正在学习 C++。我曾经是一个论坛的常客,在该论坛上,在 AP 计算机科学课程中学习 C++ 的美国学生经常会遇到类似的问题。他们中的一些人似乎在发现他们学到的课件类库在学术界以外无法获得之前就已经进入了工作场所。
【解决方案2】:

我建议for_each

【讨论】:

    【解决方案3】:

    你在用什么书?

    foreach 不是 C++ 关键字,我认为将其以特定语法引入该语言的最接近的扩展是 Visual C++,如以下链接所述:http://blogs.msdn.com/b/arich/archive/2004/09/08/227139.aspx

    &lt;algorithm&gt; 中有 for_each,但它的签名与您使用的非常不同(这是一种非常 Java 的 for-each 语法)。

    我还注意到您使用的 Mapstd::map 不同?

    【讨论】:

      【解决方案4】:

      因为函数名是for_each 附:正如标签所建议的那样,我认为这是一个 C++ 问题,但 C++ 的语法完全错误。

      【讨论】:

      • 好吧。但你不能那样使用它。
      【解决方案5】:

      foreach 不是 C++ 中的构造!

      【讨论】:

        【解决方案6】:

        C++ 中不存在 foreach。

        在最新版本的 C++ 中,它只是在一些最新的编译器中刚刚发布,你可以使用“基于范围的 for-loop”.. 在这个页面上找到它:http://en.wikipedia.org/wiki/C%2B%2B0x

        我怀疑您的编译器是否支持这一点。所以,也许现在坚持使用 for 循环。

        【讨论】:

          【解决方案7】:

          尝试遍历地图的大小。

          for(int i=0;i<MAP.size();++i)
              // something with MAP.at(i);
          

          用您的地图对象替换 MAP。

          祝你好运!

          问候,
          丹尼斯 M.

          【讨论】:

          • 使用迭代器将更接近于 foreach 构造,尽管语法可能有些麻烦。
          • 地图不是这样编入索引的。使用迭代器。
          【解决方案8】:

          您示例中的代码看起来像是 C# 和 C++ 语法的混合体。 foreach 结构本身是 C# 语法,C++/CLI(由 VC++ 支持)和 C++0x(由 GCC 4.6 支持)一样,都有一个 for each 结构,但都不遵循该语法。

          【讨论】:

            【解决方案9】:

            Qt 支持foreach,使用如下:

            QDir dir("Dir");
            dir=QFileDialog::getExistingDirectory(0,"Select Folder: ");
            QFileInfoList list = dir.entryInfoList(QDir::Dirs| QDir::Files | QDir::NoDotAndDotDot);
            
            std::vector<std::string> names;
            foreach(QFileInfo finfo, list){
                std::string str=dir.path().toStdString().c_str();
                str=str+"/";
                names.push_back(str+finfo.fileName().toStdString().c_str());
            }
            

            但是,当您在头文件上使用 #define QT_NO_KEYWORDS 时,foreach 已禁用。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-09-09
              • 1970-01-01
              • 2015-06-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多