C++ std::移动ecplise中的无效参数
我正在用这个简单的例子测试std::move 但是当我试图编译这段代码时,出现了错误C++ std::移动ecplise中的无效参数,c++,eclipse,c++11,C++,Eclipse,C++11,我正在用这个简单的例子测试std::move 但是当我试图编译这段代码时,出现了错误 #include <utility> // std::move #include <iostream> // std::cout #include <vector> // std::vector #include <string> // std::string int main () { std::string fo
#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有什么问题
我使用的是eclipse版本3.8我猜eclipse调用的
gcc
没有收到-std=c++11
参数。如果您有现代CDT,请查看此页面:如果没有,请按照@JoshKelley的建议执行您从Eclipse CDT的代码分析中得到错误,而不是从编译器中得到错误。代码分析可能是有用的,但是它可以很好地设置,并且因为它涉及Eclipse做它自己的(有限)C++解析,它并不总是与真正的编译器一致。(类型列中的“语义错误”是一个代码分析错误。实际的编译器错误列为“C/C++错误”。)
代码分析错误是无害的——正如您所看到的,它们不会影响编译。为了使代码分析工作正常,Eclipse进行“发现”——它调用GCC本身并解析输出以确定诸如预处理器定义、包含路径等内容。当Eclipse进行发现时,很可能没有启用C++11。修复它在某种程度上取决于您的系统和Eclipse版本;下面是我如何修复它的:
-std=c++11
添加到“获取编译器规范的命令”的末尾在最新的Eclipse中,如果让Eclipse管理C++设置,而不是编写自己的MaCo文件,那么,可以使用手动编辑编译器设置来代替。 这里有一些其他的东西可以尝试
- 确保您正在运行最新的Eclipse和Eclipse CDT。C++11并没有那么旧,EclipseCDT每年都会有重大的更新,尤其是代码分析非常复杂,需要能够找到的最新代码
- 它有时有助于重新编制索引:右键单击项目,转到“索引”下,然后选择“重建”。如果此操作不起作用,则可以重新编制索引
g++ -D__GXX_EXPERIMENTAL_CXX0X__ -std=c++11 test.cpp