- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我最近将一个 MFC 应用程序从 VS2010 升级到 VS2015 时,基本上对 .vcxproj 文件进行了两处更改:
<Project>
下的 ToolsVersion="4.0"<PlatformToolset>v140</PlatformToolset>
添加到它用于在 VS2010 下编译正常的代码不再编译,但如果我撤销这些更改中的第二个,它确实可以编译。我真的不清楚为什么。代码——我无法清楚地发现其中的问题——本质上是这样的:
class SomeClass
{
union SomeUnion
{
struct
{
CPoint thisData; // MFC/ATL type - atltypes.h
char thatData[ 6 ];
};
double otherData;
};
void SetSomeStuff( const std::vector<SomeUnion> & someStuff );
void GetSomeStuff( std::vector<SomeUnion> & someStuff );
};
这很好——编译时有或没有 PlatformToolset
都没有错误在 VS2015(或 VS2010)下。当我尝试为 SomeClass::SomeUnion::SomeUnion( void )
调用构造函数时出现错误在GetSomeStuff()
函数体是这样的:
void SomeClass::GetSomeStuff( std::vector<SomeUnion> & someStuff )
{
someStuff.resize( 2 ); // error C2280 depending on compiler??
}
我的猜测是使用 PlatformToolset
设置为 v140
强制执行 union 的新规则(可能在 C++11 中?)这意味着某些构造函数或赋值运算符现在被强制定义为基于某些理由被删除。如果有,依据是什么?是this与我认为相关的是由于不能简单地在此处复制的“非平凡”元素?哪个元素以及为什么?
编辑 最初这个问题被过度简化并使用了 short thisData
而不是 CPoint thisData
由于错误消息突出显示 SomeClass::SomeClass()
作为罪魁祸首。
最佳答案
升级您的 VC++ 项目旨在成为一种单向前向转换,尽管已经付出了一些努力来尝试使 vcxproj 文件更稳健地在往返转换中幸存下来。
当您使用 Platform Toolset v140
时,您使用的是版本 19.0 的 VS 2015 C++ 编译器。它是一个符合 C++11 的编译器,而 VS 2010(C++ 版本 16.0 使用 v100
平台工具集)是一个 C++0x Draft 支持版本。
VS 2015 编译器将发出一些 VS 2010 不会发出的新警告和消息,其中一些是 C++11 一致性,另一些是关于过去导致错误代码生成的错误。参见 Breaking Changes VS 2012 , Breaking Changes VS 2013 , Breaking Changes VS 2015 , 和 Breaking Change VS 2015 Update 1查看自 VS 2010 以来的重大变化。VS 2012 和 VS 2013 编译器各有 4 个更新,因此您基本上是在此处跳过 12 个 C++ 编译器版本。
Another major difference is that VS 2015 uses the Universal CRT.
我无法重现您的问题,因为您没有提供足够的代码。以下版本在 VS 2015 中构建得很好。在 /W4
下,您将收到一条警告,提示您正在使用无名结构,从技术上讲,它是 MSVC 扩展,但仅此而已。
#include <vector>
class SomeClass
{
public:
union SomeUnion
{
struct
{
short thisData;
char thatData[ 6 ];
};
double otherData;
};
void SomeClass::GetSomeStuff( std::vector<SomeUnion> & someStuff )
{
someStuff.resize( 2 );
}
};
您的重现中一定遗漏了一些重要问题。也就是说,VS 2015 很可能会发出 VS 2010 不会发出的错误/警告,这是设计使然。
You can write code that builds cleanly with VS 2010 - VS 2015, but it requires sticking with the C++0x language features and Standard C++ Library supported by VS 2010. You can use a few adapters to make life a little easier, but there's really no compelling reason to stick with VS 2010 for most use cases. See Dual-use Coding Techniques for Games for a tables showing the changes to the language and libraries between 2010 - 2015.
Really the biggest issue is that VS 2010 uses the Windows 7 SDK while VS 2012-2015 uses the Windows 8 SDK which has some pretty major differences particularly for DirectX development. You can technically get VS 2010 to use the Windows 8 SDK via a props solution, but it's not an officially support combination.
关于c++ - PlatformToolset 和 "deleted function"错误 (C2280),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35331720/
当我最近将一个 MFC 应用程序从 VS2010 升级到 VS2015 时,基本上对 .vcxproj 文件进行了两处更改: ToolsVersion="14.0"替换了 下的 ToolsVersi
我现在从 VS 2005 转移到 VS 2010,产品由几个解决方案组成,每个解决方案都有很多项目。我想利用属性表系统,以便我们的众多配置更容易维护。 问题之一是我们想要使用 Windows SDK
我是一名优秀的程序员,十分优秀!