我正在对一些功课C ++代码进行评分,而一名学生使用非标准构造函数来处理向量:
vector<vector<double> > A(rows, cols);
其中rows
和cols
是无符号整数。我们在课堂上教它的方式是
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的计算机上运行的,这就是差异
答案 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编译器版本。