c++ - 使用带模板参数的交换与 std::vector include 冲突

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

今天我遇到了 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 中的一个奇怪错误吗?为什么会发生这种情况?

最佳答案

这是一个 known issue在 MSVC 编译器中。他们争辩说“标准实际上不允许使用显式模板参数调用 swap()”。

关于c++ - 使用带模板参数的交换与 std::vector include 冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37748309/

相关文章:

c - 使用进位标志的多字加法

swift - Swift关联类型编译错误

compiler-errors - SOX : installing libmad make[1]: *** [all-recursive] Error 1 & make: *** [all] Error 2

c++ - 为什么 "make distcheck"在这个非常基本的 "Hello, World!"自动工具示例中失败?

c++ - OpenCV 1.x 后端

c++ - 如何加快 std::string 与字符串文字的比较速度?

visual-studio-2010 - 为什么在 C++/CLI 中写入时会出现未处理的异常访问冲突?

c++ - 错误: ISO C forbids comparison between pointer and integer

c++ - 创建非 odr 使用的文字类型

c++ - 返回 vector<pair<string,string>> 会导致 gcc 编译代码 (curlcpp) 崩溃