使用带有模板参数的交换与 std::vector 包含冲突

using swap with template argument conflicts with std::vector include

本文关键字:std vector 冲突 包含 交换 参数      更新时间:2023-10-16

今天我遇到了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.0VCINCLUDExlocale(341): warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc
C:Program Files (x86)Microsoft Visual Studio 14.0VCINCLUDEvector(1892): error C2825: '_Alloc': must be a class or namespace when followed by '::'
C:Program Files (x86)Microsoft Visual Studio 14.0VCINCLUDEvector(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.0VCINCLUDEvector(1892): error C2510: '_Alloc': left of '::' must be a class/struct/union
C:Program Files (x86)Microsoft Visual Studio 14.0VCINCLUDEvector(1892): error C2146: syntax error: missing '>' before identifier 'difference_type'
C:Program Files (x86)Microsoft Visual Studio 14.0VCINCLUDEvector(1898): error C2825: '_Alloc': must be a class or namespace when followed by '::'
C:Program Files (x86)Microsoft Visual Studio 14.0VCINCLUDEvector(1898): error C2510: '_Alloc': left of '::' must be a class/struct/union
C:Program Files (x86)Microsoft Visual Studio 14.0VCINCLUDEvector(1898): error C3646: '_Sizet': unknown override specifier
C:Program Files (x86)Microsoft Visual Studio 14.0VCINCLUDEvector(1898): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
C:Program Files (x86)Microsoft Visual Studio 14.0VCINCLUDEvector(1906): error C2061: syntax error: identifier '_Sizet'
C:Program Files (x86)Microsoft Visual Studio 14.0VCINCLUDEvector(1913): error C2061: syntax error: identifier '_Sizet'
C:Program Files (x86)Microsoft Visual Studio 14.0VCINCLUDEvector(1920): error C2061: syntax error: identifier '_Sizet'
C:Program Files (x86)Microsoft Visual Studio 14.0VCINCLUDEvector(1937): error C3646: '_Myoff': unknown override specifier
C:Program Files (x86)Microsoft Visual Studio 14.0VCINCLUDEvector(1937): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

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

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

这是 MSVC 编译器中的已知问题。他们认为"使用显式模板参数调用 swap() 实际上是标准所不允许的"。