【问题标题】:Visual C++: Using nested templates, is it possible to mark ">>" instead of "> >" as error?Visual C++:使用嵌套模板,是否可以将“>>”而不是“>”标记为错误?
【发布时间】:2014-12-12 10:05:49
【问题描述】:

使用嵌套模板时是否可以在 Visual Studio 中将“>>”而不是“>”标记为错误?

示例代码:

void foo(std::vector<std::vector<double>>) {}

Visual C++ 编译器(我使用的是 VS10/2010)即使在警告级别 4 上也不会抱怨,但在 Unix 和 Linux 编译器上构建会失败并出现错误 (ideone):

error: '>>' should be '> >' within a nested template argument list

是否可以将此标记为错误?

我想确保我的代码在尽可能多地发送到 CI 服务器之前没有这些琐碎的语法错误...

【问题讨论】:

  • 您是否可以控制 CI 服务器上使用的命令行选项? &gt;&gt; 从 C++11 开始完全有效,如果您在命令行。
  • 这不是C++11的错误,见ideone.com/ossbOr
  • 好主意,我不知道 - 我会检查 ;)
  • 将你的 linux 编译器设置为 C++11 例如与 g++ -std=c++11
  • 这有点困扰我,我们必须明确告诉 g++ 使用最新的 C++ 标准......但是,我们这样做了。

标签: c++ visual-studio-2010 visual-studio


【解决方案1】:

C++11 使 &gt;&gt; 结束嵌套模板合法。问题是 VC++ 2010 实现(并无条件启用)C++11 的这一部分,但是您使用的其他编译器要么没有在您的目标版本中实现这一点,要么您没有启用他们的 C+ +11 模式。

VC++ 不支持模式,而是在实现它们时简单地启用一些语言规范。因此,您的解决方案是将 VC++ 编译器降级到不启用此功能的版本,或者在您所针对的其他编译器上升级或启用 C++11,以免出现错误。


如果您无法做到其中任何一个,并且您还没有使用自动构建系统,那么您可以设置一个来帮助比目前更快地捕获这些兼容性错误。配置一个,这样一旦任何团队成员提交新代码,代码就会在您支持的所有平台上得到检查。

自动化构建系统通常还允许用户直接从团队成员的工作目录提供代码更改以检查所有构建从属服务器,而不是要求首先将代码提交到共享存储库。设置它与直接在每个受支持的平台上进行初始开发一样好。

【讨论】:

    【解决方案2】:

    这是使用 GCC 4.8.1 而不是 Visual Studio 2010 (MSVC10) 的错误的原因是前者默认不使用 C++11,而后者默认使用 C++11。能够在嵌套模板列表中使用 &gt;&gt; 是 C++11 的一项功能。要在 GCC 和 Clang 中使用 C++11 功能,您至少需要将 -std=C++11 标志传递给编译器。

    至于使用智能感知在 Visual Studio 中显示这一点,我认为这是不可能的,因为无法告诉 MSVC 编译为不同的 ISO 标准。

    【讨论】:

      猜你喜欢
      • 2012-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-01
      • 2022-01-05
      • 2012-09-20
      • 2015-06-16
      相关资源
      最近更新 更多