1

伙计们,我希望 VC 在编译 c++ 模板代码时具有与 GCC 相同的严格编译规则。但我不知道如何在我的 VC9.0 (Visual Studio 2008) 中设置它。

例如,以下代码在 GCC 中是不允许的。

AutoPtr<RefCounted<Shape>> shape;

因为这里不允许使用 ">>",并且 gcc 要求在 ">>" 之间添加至少一个空格。

AutoPtr< RefCounted<Shape> > shape;

VC 不会将此视为错误。据我了解,VC对模板代码编译的限制比较宽松。

如何在 VC 中添加更多限制以使其与 GCC 规则相同?

4

4 回答 4

3

你没有。:( MSVC++ 只是错误地处理模板,你必须小心。


请注意,您的特定示例实际上并不是C++0x中的错误,因此 MSVC2010 实际上接受它是正确的。(虽然在很多其他事情上它仍然是错误的,但它变得更好了。)

您甚至可以“作弊”并为您的 gcc 编译启用 C++0x 以允许它;请确保不要意外使用 MSVC2008(或 MSVC2010!)无法支持的 C++0x 内容。

于 2011-03-30T02:27:32.733 回答
3

我不会真的把它称为错误——C++0x 已经解除了这个限制,所以我会习惯它。更重要的是,Visual Studio 非常乐意接受与 C++03 兼容的括号之间有空格,所以我只是使用它而忘记它。没有办法改变 Visual Studio 的解析器不符合标准中规定的事实,这是它不符合标准的最不重要的方式。

于 2011-03-30T03:45:30.120 回答
1

我恭敬地不同意 GMan 的说法:“MSVC++ 只是错误地处理了模板”。相反,我会说 MSVC 和 GCC 都错误地处理模板,每个都以自己的方式:)

为了处理编译器细节,维护一组一些编译时测试模块是值得的。此外,现代构建系统(例如 bjam)可以配置为在项目编译后立即运行简短的单元测试。因此,您所要做的就是不时使用 gcc 工具集(和/或在非 Windows 平台上)构建您的项目,以确保一切按预期工作。

PS。否决票不是我的:)

于 2011-03-30T03:41:55.487 回答
1

您是否尝试过禁用 Microsoft 特定的扩展

于 2011-03-30T03:46:37.290 回答