【问题标题】:Understanding compiler options differences in visual studio 2010 and strict C++ compliance了解 Visual Studio 2010 中的编译器选项差异和严格的 C++ 合规性
【发布时间】:2014-04-21 20:30:04
【问题描述】:

我正在为一些家庭作业 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 中寻找答案,但找不到答案。

编辑:我认为这可能对其他人有帮助:感谢 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


【解决方案1】:

其实:

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

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

规则是(或曾经)很简单,如果在 构造函数导致构造函数 &lt;template Iter&gt;std::vector::vector( Iter begin, Iter end ) 被选中,Iter 推导出一个整数类型,代码 必须表现得好像 std::vector::vector( static_cast&lt;size_type&gt;( begin ), static_cast&lt;value_type&gt;( end ) ) 被称为。

【讨论】:

  • 即使您的评论正确地解释了正在调用的构造函数,因为我的问题更多是关于 VS 而不是 C++,我将不得不将不同的答案标记为正确。不过你的解释很有帮助
【解决方案2】:

当您在命令行编译时,您没有使用 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)

【讨论】:

  • 你是对的!运行脚本时,我使用的是另一台装有 VS2013 的计算机。但直到现在才意识到这一点。显然,计算机实验室管理员决定隐藏它,直到每台计算机都拥有它。我很抱歉这个错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多