从PNaCl,我使用libstdc ++编译相同的代码。但是我想使用shared_ptr并且我得到了这个错误:
error: call to implicitly-deleted copy constructor of
此问题有问题:
Using std::shared_ptr with clang++ and libstdc++
我理解,但我不知道如何解决这个问题。我引用了解决方案:
将默认的复制构造函数和复制赋值运算符添加到shared_ptr将解决问题。
我在shared_ptr.h中添加:
shared_ptr(const shared_ptr&) noexcept = default;
但编译器现在返回此错误:
F:/nacl_sdk/pepper_31/toolchain/win_pnacl/usr/include/c++/4.6.2/bits/shared_ptr.
h:268:19: error:
exception specification of explicitly defaulted copy assignment operator
does not match the calculated one
shared_ptr& operator=(const shared_ptr&) noexcept = default;
^
在这个错误链中,我在这里结束。
有人有提示吗?
答案 0 :(得分:1)
我能用这个简单的测试用例重新编写你的错误:
#include <memory>
int main() {
std::shared_ptr<int> foo;
std::shared_ptr<int> bar(foo);
std::shared_ptr<int> baz;
baz = foo;
return 0;
}
使用pnacl-clang++ -std=c++11 -stdlib=libstdc++ test.cc
构建
解决问题的最简单方法是使用libc ++而不是libstdc ++:
pnacl-clang++ -std=c++11 -stdlib=libc++ test.cc
这在pepper_31中是“实验性的”,但在pepper_33及更高版本(目前是pepper_canary)中将是默认值。有关此切换的详细信息,请参阅https://groups.google.com/forum/#!topic/native-client-discuss/0spfg6O04FM。
我还能够破解两个头文件,使其与libstdc ++一起使用:
在bits / shared_ptr.h中:
template<typename _Tp>
class shared_ptr : public __shared_ptr<_Tp>
{
public:
shared_ptr(const shared_ptr&) = default;
shared_ptr& operator =(const shared_ptr&) = default;
...
在bits / shared_ptr_base.h中:
template<typename _Tp, _Lock_policy _Lp>
class __shared_ptr
{
public:
__shared_ptr(const __shared_ptr&) = default;
__shared_ptr& operator =(const __shared_ptr&) = default;
...
IMO,使用libc ++是一个更好的解决方案。 :)