我正在使用 Visual Studio 2013,但遇到了一个奇怪的问题。当我导出一个类时,它会抛出“尝试引用已删除的函数”错误。但是,当该类未导出时,它的行为会正确。
让我举个例子...
class Foo
{
};
// note the export
class __declspec(dllexport) Bar
{
// the following line throws the error
std::unordered_map<std::string, std::unique_ptr<Foo>> map;
};
现在,如果我删除导出,那么看起来以下所有内容都按预期工作。
class Foo
{
};
// note I removed the export
class Bar
{
// the following line now compiles without any issues
std::unordered_map<std::string, std::unique_ptr<Foo>> map;
};
现在,这是编译器错误还是我明显遗漏的其他内容?仅供参考,上面的代码可以在 GCC 或 Clang 中正常运行。
Error 2 error C2280: 'std::unique_ptr<Foo,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)' : attempting to reference a deleted function c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmemory0 592
从 dll 导出类时,编译器显式生成所有特殊成员方法(复制构造函数等,否则在这种情况下将未声明)。如您所见,生成的复制构造函数然后在唯一指针上生成无效副本;因此出现错误。
我不认为这只是一个错误,我认为它很可能是不受支持的场景的一部分。
您可以尝试在Bar
类复制构造函数并检查编译器是否接受它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)