Clang 4.6.2,使用shared_ptr

时间:2013-12-10 18:06:17

标签: c++ clang shared-ptr google-nativeclient

从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;
              ^

在这个错误链中,我在这里结束。

有人有提示吗?

1 个答案:

答案 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 ++是一个更好的解决方案。 :)