如果我包含“-ansi”编译器选项,为什么我的C++0x代码无法编译?

11

我遇到了一个非常奇怪的错误,只有在使用 ansi 标志时才会出现。

#include <memory>

class Test
{
  public:
    explicit Test(std::shared_ptr<double> ptr) {}
};

这是编译结果,已经在gcc 4.5.2和4.6.0 (20101127)上测试过:

g++ -std=c++0x -Wall -pedantic -ansi test.cpp
test.cpp:6:34: error: expected ')' before '<' token

但是没有使用-ansi编译也可以工作。为什么?


@Rob 实际上,只有第一个 (minimal.hpp) 是必要的。 - user2100815
3个回答

10

对于GNU C++编译器,-ansi-std=c++98的另一个名称,它会覆盖之前在命令行上使用的-std=c++0x。你可能只想使用

$ g++ -std=c++0x -Wall minimal.cpp

(-pedantic 默认已经开启了,所以不需要再次指定。如果你想要更严格的警告信息,可以尝试添加 -Wextra.)


1
“-pedantic” 在 C++ 中默认开启了吗? - Lightness Races in Orbit
@LightnessRacesinOrbit 是的,文档在这一点上有些不清楚,但我记得它一直都是这样。更准确地说,在C++中-pedantic-errors是默认值,而-fpermissive模式对于C来说大致相同于-pedantic;我甚至不确定是否可能在C++中禁用这些警告。 - zwol
1
“为了获得标准所要求的所有诊断信息,您还应指定 -pedantic(或者如果您希望它们成为错误而不是警告,则为-pedantic-errors)。” 这对我来说很清楚。我的经验是添加 -pedantic 会产生更多警告。因此,我必须不同意你的观点。 - Lightness Races in Orbit
@zwol:我真的不明白你在说什么。也许这个和这个会让事情更清楚?据我所知,-pedantic从来没有成为默认值,也从未成为无操作。文档和给定的示例与我的陈述相符。我找不到任何支持你的证据。因此,声称整个观察结果都是一个错误...似乎很傻!另一方面,如果我的“现场演示链接”还不足以说服你,那么我想我们就完成了。 - Lightness Races in Orbit
@LightnessRacesinOrbit 是的,我真的相信你所说的每一个轶事都反映了编译器或其文档中的错误,因为我相信我知道这应该如何工作,基于,嗯,我曾经直接与编写GCC的C++解析器的人一起工作。这就是为什么我一直在说你应该向gcc-help@和/或他们的bug跟踪器提出这个问题。 - zwol
显示剩余5条评论

3

std::shared_ptr在C++98中不存在。尝试进行以下更改:

#include <tr1/memory>
...
explicit Test(std::tr1::shared_ptr<double> ptr) {}   

0

嗯,因为C++0x还没有ANSI标准? ANSI标志检查符合现有标准的情况,而不是未来标准。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接