【问题标题】:Compiler option not working for unordered set C++11 feature编译器选项不适用于无序集 C++11 功能
【发布时间】:2013-07-20 00:08:12
【问题描述】:

我在 Ubuntu 12.04 x64 上,使用带有 CDT 插件的 Eclipse Indigo,我的 g++ 版本是 4.7.3。我添加了编译器选项-std=c++11 和发现选项的相同选项(即使我编写代码时代码没有自动完成)。

Eclipse 用红色强调以下部分并给出警告。但是,程序在运行时(忽略错误)会打印预期结果(Compiled with gcc 4.7\n 1 0\n)。如何解决此问题?

#include <unordered_set>
#include <iostream>
using namespace std;

int main()
{
    unordered_set<int> s; // Symbol unordered_set cannot be resolved
    cout << "Compiled with gcc " << __GNUC__ << '.' << __GNUC_MINOR__ << endl;
    s.insert(0); // Method insert cannot be resolved
    s.insert(1); // Method insert cannot be resolved
    s.insert(0); // Method insert cannot be resolved
    for(auto i = s.begin(); i != s.end(); ++i) cout << ' ' << (*i);
        // Method begin and end cannot be resolved
    cout << endl;
    return 0;
}

这是 Eclipse 在命令行中调用的:

...$ gcc -E -P -v -dD -std=c++11 .../specs.c
Using built-in specs.
...
gcc version 4.7.3 (Ubuntu/Linaro 4.7.3-2ubuntu1~12.04) 

为我的C 编译器关闭-std=c++11 编译器选项后(因为无论如何都不需要它) - C++ 编译器保持它打开,输出打印到控制台如下。

...$ g++ -E -P -v -dD -std=c++11 .../specs.cpp 
Using built-in specs.
...
gcc version 4.7.3 (Ubuntu/Linaro 4.7.3-2ubuntu1~12.04)

而且,无论 Eclipse 向我显示什么错误,输出仍然是相同的,显示无序集可以正常工作并且已正确编译。这显然只是构建之前的一个问题。如果我的索引器在构建之前没有正确解析,那么该集合在运行时如何工作?

【问题讨论】:

  • 您可能安装了多个版本的 GCC,而 Eclipse 不知何故最终使用了错误的版本? (在代码中插入 std::cout &lt;&lt; "Compiled with gcc " &lt;&lt; __GNUC__ &lt;&lt; '.' &lt;&lt; __GNUC_MINOR__ &lt;&lt; std::endl; 之类的东西,让它输出用于编译它的 GCC 版本。)
  • @jogojapan 是的,我确实安装了多个版本的 GCC,但您的代码返回“使用 gcc 4.7 编译”——应该有 c++11,对吧?
  • 是的,没错。从 4.7 开始,C++11 选项确实是 -std=c++11(在 4.6 和更早版本中它曾经是 -std=c++0x)。所以,我不知道为什么它不起作用。
  • 也许编译器是正确的版本,但标准库的包含文件不是。我有一段时间没有为多个 GCC 版本配置 Eclipse,但是在某个地方没有包含目录的选项吗?也许它会从错误的 GCC 安装中获取它们。
  • @jogojapan 是的,这就是我难过的原因。我跟着c ++ 11激活到一角钱,它仍然不起作用。我应该删除我的旧 gcc 安装(我该怎么做?)?项目资源管理器在我的项目中有一个“包含”目录 - 它显示 unordered_map 文件 - 我将发布一张图片。谢谢你的时间,顺便说一句。

标签: c++ eclipse c++11 eclipse-cdt


【解决方案1】:

您使用的编译器可能不支持 C++11,请查看您的手册页或 IDE 文档,它会告诉您是否支持。

【讨论】:

  • 我的g++和gcc版本也是4.7.3,所以至少应该都支持unordered_set
  • 我在 Mac OS X 上编译的 GCC/G++ 4.7.1 当然可以与-std=c++11 配合使用,并接受您的原始代码。你的机器上有多个版本的 G++ 吗? Eclipse 是否使用您期望的版本?尝试在选项中添加-v;它报告了大量关于编译器正在做什么的信息。
  • @JonathanLeffler 请查看我对问题本身的评论以回应 jogojapan
【解决方案2】:

您的问题是文件的扩展名是.c 而不是.cpp(或.cc),这导致它被编译为gcc 而不是g++

这意味着它被视为纯 C 代码而不是 C++11,因此它不会编译也就不足为奇了。

【讨论】:

  • 不,很遗憾,我可以确认我的文件名为main.cpp,并且 Eclipse 将该扩展名识别为 C++ 源代码。此外,无序集按预期工作。这只是构建之前的一个问题。
  • 就是这样 - 它确实编译!它也没有在旧版本的编译代码上运行 - 添加s.insert(2),果然,输出2 1 0
【解决方案3】:

我放弃了,因为我无能为力,清除了我的 eclipse 系统和我的 ~/.eclipse 文件夹,下载了 Kepler 及其 CDT 版本,现在一切正常。

【讨论】:

    猜你喜欢
    • 2015-02-15
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多