std ::在eclipse中移动无效参数

时间:2014-06-04 15:05:52

标签: c++ eclipse c++11

我正在用这个简单的例子测试std :: move

但是当我尝试编译此代码时,会发生错误

enter image description here

#include <utility>      // std::move
#include <iostream>     // std::cout
#include <vector>       // std::vector
#include <string>       // std::string

int main () {
  std::string foo = "foo-string";
  std::string bar = "bar-string";
  std::vector<std::string> myvector;

  myvector.push_back (foo);                    // copies
  myvector.push_back (std::move(bar));         // moves

  std::cout << "myvector contains:";
  for (std::string& x:myvector) std::cout << ' ' << x;
  std::cout << '\n';

  return 0;
}

但eclipse中的控制台窗口似乎表示编译成功如下

enter image description here

所以我尝试使用console命令编译而不是eclipse来检查什么是正确的

g++ -D__GXX_EXPERIMENTAL_CXX0X__ -std=c++11 test.cpp

这是成功和有效的。

eclipse有什么问题?

我正在使用eclipse版本3.8

2 个答案:

答案 0 :(得分:8)

您从Eclipse CDT的代码分析中获得错误,而不是来自编译器。代码分析可能很有用,但设置起来很复杂,并且因为它涉及Eclipse执行自己的(有限的)C ++解析,所以它并不总是与真正的编译器一致。 (“类型”列中的“语义错误”是一个赠品,它是代码分析错误。实际编译器错误列为“C / C ++错误”。)

代码分析错误是无害的 - 如您所见,它们不会影响编译。为了使代码分析工作,Eclipse执行“发现” - 它调用GCC本身并解析输出以确定预处理器定义,包含路径等内容。当Eclipse发现时,Eclipse很可能不启用C ++ 11 。修复它在某种程度上取决于您的系统和Eclipse版本;这是我如何解决它:

  1. 转到Windows,首选项,C / C ++,构建,设置。
  2. 在“发现”选项卡下,选择“CDT GCC内置编译器设置[共享]”。
  3. -std=c++11添加到“命令的末尾以获取编译器规范。”
  4. 单击“应用”。单击确定。
  5. 此后您可能需要重新索引;见下文。
  6. 在最新的Eclipse中,如果您让Eclipse管理您的C ++设置而不是编写自己的makefile,那么就像@user3159253 says一样,您可以使用toolchain support而不是手动编辑编译器设置。 / p>

    以下是其他一些尝试。

    • 确保您运行的是最新的Eclipse和Eclipse CDT。 C ++ 11 ,并且Eclipse CDT每年都会获得重大的新更新,特别是代码分析很复杂,需要您能找到的最新代码。
    • 有时可以帮助重新索引:右键单击您的项目,进入索引,然后选择重建。如果不起作用,可以使用More drastic approaches重建索引。

答案 1 :(得分:3)

我猜Eclipse调用gcc并没有收到-std=c++11参数。如果您有现代CDT,请查看此页面:http://wiki.eclipse.org/CDT/User/NewIn83#Toolchains如果没有,请按照@JoshKelley的建议进行操作