【发布时间】:2014-04-21 20:30:04
【问题描述】:
我正在为一些家庭作业 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 中寻找答案,但找不到答案。
编辑:我认为这可能对其他人有帮助:感谢 cmets,我现在了解 IDE 中调用的构造函数是范围构造函数(上面链接中的#3)。
这是我的特殊问题:两种方法都使用具有不同选项的相同编译器(一种是 IDE 的默认值,另一种如上所述)。批处理文件会引发错误,而 IDE 不会。我需要帮助确定 IDE 命令行参数中要更改的内容,以便引发错误。
更新:我包含了错误消息。
更新 2:原来脚本是在装有 MSVC 2013 的计算机上运行的,这就是区别
【问题讨论】:
-
老实说,我真的不知道如何命名。也许正确的描述会更容易找到答案。
-
@PaulMcKenzie:选择了带有两个迭代器的构造函数,因为从语言的角度来看
Iterator没有意义,它可以推断出类型为Iterator == unsigned int。现在,该标准有关于应该在那里做什么(我找不到)的具体措辞,要求它具有与构造函数相同的行为,采用大小和值,除了实现正在对@987654332 进行显式转换@ (而不是如果选择重载会发生的隐含)并且正在绕过explicit... -
@Kevin:您在命令行中遇到的错误是什么?编译器是否相同(也许命令行正在选择vs2013?)?无论如何,不要将其视为负担,而应视为机会。拿走一些(少量,甚至什么都不做,只是说一下)点,教他们一个不同的工具链。花时间在课堂上解释编译器接受代码并不意味着代码是正确的。给他们一个different toolchain 并告诉他们交叉检查他们的代码......这真的是一个机会进行教学。
-
感谢大家的帮助(之前有人在评论中提出了建议,我错误地认为事实并非如此)。有一个隐藏的VS2013安装。我为我的愚蠢错误感到抱歉
-
这个问题似乎是题外话,因为你的问题有缺陷:“两种方法都使用相同的编译器”,除了你的更新 2 说根本原因是运行不同的编译器。
标签: c++ visual-studio-2010 vector compiler-errors