了解Visual Studio 2010中的编译器选项差异和严格的C ++合规性

时间:2014-04-21 20:30:04

标签: c++ visual-studio-2010 vector compiler-errors

我正在对一些功课C ++代码进行评分,而一名学生使用非标准构造函数来处理向量:

vector<vector<double> > A(rows, cols);

其中rowscols是无符号整数。我们在课堂上教它的方式是

vector<vector<double> > A(rows, vector<double>(cols));

在填充构造函数(http://www.cplusplus.com/reference/vector/vector/vector/中的2)

之后

我正在使用批处理文件使用命令行编译所有学生代码

cl /O2 /EHsc /Tp <filename>

并且此命令在上述学生行中抛出此错误:

error C2664: 'std::vector<std::vector<double,std::allocator<_Ty>>,std::allocator<std::vector<_Ty,std::allocator<_Ty>>>>::vector(std::initializer_list<std::vector<_Ty,std::allocator<_Ty>>>,const std::allocator<std::vector<_Ty,std::allocator<_Ty>>> &)' : cannot convert argument 2 from 'unsigned int' to 'const std::vector<double,std::allocator<_Ty>> &'
    with
    [
        _Ty=double
    ]
    Reason: cannot convert from 'unsigned int' to 'const std::vector<double,std::allocator<_Ty>>'
    with
    [
        _Ty=double
    ]
    Constructor for class 'std::vector<double,std::allocator<_Ty>>' is declared 'explicit'
    with
    [
        _Ty=double
    ]

但是当我创建一个项目并使用默认参数MSVC 2010构建它时,它既不会抛出警告也不会抛出错误。

我正在尝试了解哪些编译器选项负责允许它在IDE中没有警告的情况下通过,以及我将其关闭的内容。

我尝试在http://msdn.microsoft.com/en-us/library/2tb15w2z(v=vs.100).aspx中找到答案,但我无法回答。

编辑:我认为这可能对其他人有所帮助:感谢我现在理解的注释,IDE中调用的构造函数是范围构造函数(上面链接中的#3)。

这是我的特殊问题:两种方法都使用相同的编译器和不同的选项(一种是IDE的默认选项,另一种是上面说明的选项)。批处理文件抛出错误,IDE没有。我需要帮助确定IDE的命令行参数中要更改的内容,以便它抛出错误。

更新:我收到了错误消息。

更新2:事实证明该脚本是在具有MSVC 2013的计算机上运行的,这就是差异

2 个答案:

答案 0 :(得分:3)

实际上:

std::vector<std::vector<double> a( rows, columns );

是合法的,或者至少在C ++ 11之前它是合法的。事实并非如此 故意合法,但标准措辞的方式,a 编译器需要接受它。 (我认为C ++ 11解决了这个问题。 虽然这样做有点太晚了,因为这样做会打破 以前的法律代码。)

规则是(或是)简单,如果重载决议 构造函数导致构造函数 <template Iter>std::vector::vector( Iter begin, Iter end ) 被选中,Iter推导出一个整数类型的代码 必须表现得好像 std::vector::vector( static_cast<size_type>( begin ), static_cast<value_type>( end ) ) 被称为。

答案 1 :(得分:1)

当您在命令行编译时,您没有使用VS 2010。

这是我从VS 2010命令行编译得到的:

C:\so-test>cl /O2 /EHsc /Tp test.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.40219.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

test.cpp
Microsoft (R) Incremental Linker Version 10.00.40219.01
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:test.exe
test.obj

当我从VS 2013命令行编译时,我收到了您的错误消息(我从VS 2012命令行获得了类似但略有不同的消息)。

我建议您查看显示的版本号,以验证您在命令行中使用的MSVC编译器版本。

  • VS 2010为16.00.xxxx(SP1为16.00.40219.01)
  • VS 2012为17.00.xxxx(更新4为17.00.61030)
  • VS 2013为18.00.xxxx(更新1为18.00.21005.1)