gpt4 book ai didi

c++ - PlatformToolset 和 "deleted function"错误 (C2280)

转载 作者:行者123 更新时间:2023-11-30 05:31:59 31 4
gpt4 key购买 nike

当我最近将一个 MFC 应用程序从 VS2010 升级到 VS2015 时,基本上对 .vcxproj 文件进行了两处更改:

  • ToolsVersion="14.0"替换了 <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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com