【问题标题】:using swap with template argument conflicts with std::vector include使用带有模板参数的交换与 std::vector 冲突包含
【发布时间】:2016-06-10 12:27:55
【问题描述】:

今天我遇到了 msvc2013 编译器的一个非常奇怪的行为。 将近一个小时后,我找到了导致错误的原因。 最小的例子:

#include <iostream>
#include <vector>


int main(int argc, char *argv[])
{
    float f1, f2;

    std::swap<float>(f1, f2);

    return 0;
}

当包含 std::vector 时,我得到一堆非常奇怪的 msvc2013 编译器错误!使用 mingw 编译代码时,代码编译得很好,正如我所期望的那样。

错误:

main.cpp
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\xlocale(341): warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\vector(1892): error C2825: '_Alloc': must be a class or namespace when followed by '::'
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\vector(1944): note: see reference to class template instantiation 'std::_Vb_iter_base<_Alloc>' being compiled
        with
        [
            _Alloc=float
        ]
main.cpp(10): note: see reference to class template instantiation 'std::_Vb_reference<float>' being compiled
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\vector(1892): error C2510: '_Alloc': left of '::' must be a class/struct/union
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\vector(1892): error C2146: syntax error: missing '>' before identifier 'difference_type'
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\vector(1898): error C2825: '_Alloc': must be a class or namespace when followed by '::'
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\vector(1898): error C2510: '_Alloc': left of '::' must be a class/struct/union
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\vector(1898): error C3646: '_Sizet': unknown override specifier
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\vector(1898): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\vector(1906): error C2061: syntax error: identifier '_Sizet'
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\vector(1913): error C2061: syntax error: identifier '_Sizet'
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\vector(1920): error C2061: syntax error: identifier '_Sizet'
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\vector(1937): error C3646: '_Myoff': unknown override specifier
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\vector(1937): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

是的 - 我知道这是现在的 msvc2015 编译器!我也测试了这个,这些是这个编译的错误消息

这是 msvc 中的一个奇怪错误,或者为什么会发生这种情况,甚至会发生这种情况?

【问题讨论】:

  • 很抱歉,我们所有的通灵师现在都出去吃午饭了,办公室里没有人知道如何使用神奇的心灵射线机来提取“奇怪的编译器错误”从您的脑海中消失,以便每个人都知道它们是什么,以便弄清楚它们的全部含义。感谢您的理解。
  • 在您的问题中包含编译器错误。
  • “奇怪的行为”?您还没有为 f1 或 f2 分配任何值,那么您怎么知道发生了一些奇怪的事情呢?您确定不是因为您正在以发布模式构建并且这会“扰乱”调试器吗?它符合我的预期,一旦我在 2010 年修复了您的代码,因此您可以查看两个版本之间修复的奇怪问题列表。你认为它应该怎么做?
  • 您不应该提供模板类型,而是应该让模板参数推导为您工作。 swap 应该像 std::swap(f1, f2); 一样使用
  • 对不起!这不是为 f1 或 f2 赋值 - 它甚至在包含 时都不会编译!如果我不包含矢量,那么一切正常!编译器错误太长,我会在我的原帖中包含它们!

标签: c++ visual-c++ compiler-errors swap


【解决方案1】:

这是 MSVC 编译器中的 known issue。他们认为“标准实际上不允许使用显式模板参数调用 swap()”。

【讨论】:

  • 感谢您的链接!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-03
  • 1970-01-01
相关资源
最近更新 更多