使用std :: unique的静态函数deleter时出错
我有下面的代码片段,无法编译......看起来应该是这样,但它现在回避我。 非常感谢任何帮助/建议!
#include <atomic>
#include <memory>
struct MyClass {
static void free_lock(std::atomic<int>** lck) { (*lck)->store(0); }
typedef std::unique_ptr<std::atomic<int>*, decltype(&MyClass::free_lock)> lock_scope;
static lock_scope get_lock() {
static std::atomic<int> lck(0);
int ref = 0;
return lock_scope(&lck, &MyClass::free_lock);
}
};
Clang 3.2报告了以下错误消息
Compilation finished with errors:
source.cpp:13:23: error: no matching constructor for initialization of 'lock_scope' (aka 'unique_ptr *, decltype(&MyClass::free_lock)>')
return lock_scope(&lck, &MyClass::free_lock);
^ ~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/bits/unique_ptr.h:130:7: note: candidate constructor not viable: no known conversion from 'std::atomic *' to 'pointer' (aka 'std::atomic **') for 1st argument
unique_ptr(pointer __p,
^
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/bits/unique_ptr.h:125:7: note: candidate constructor not viable: no known conversion from 'std::atomic *' to 'pointer' (aka 'std::atomic **') for 1st argument
unique_ptr(pointer __p,
^
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/bits/unique_ptr.h:155:2: note: candidate constructor template not viable: requires single argument '__u', but 2 arguments were provided
unique_ptr(unique_ptr&& __u) noexcept
^
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/bits/unique_ptr.h:164:2: note: candidate constructor template not viable: requires single argument '__u', but 2 arguments were provided
unique_ptr(auto_ptr&& __u) noexcept
^
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/bits/unique_ptr.h:114:17: note: candidate constructor not viable: requires 0 arguments, but 2 were provided
constexpr unique_ptr() noexcept
^
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/bits/unique_ptr.h:120:7: note: candidate constructor not viable: requires single argument '__p', but 2 arguments were provided
unique_ptr(pointer __p) noexcept
^
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/bits/unique_ptr.h:136:17: note: candidate constructor not viable: requires 1 argument, but 2 were provided
constexpr unique_ptr(nullptr_t) noexcept
^
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/bits/unique_ptr.h:142:7: note: candidate constructor not viable: requires single argument '__u', but 2 arguments were provided
unique_ptr(unique_ptr&& __u) noexcept
^
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/bits/unique_ptr.h:262:7: note: candidate constructor not viable: requires 1 argument, but 2 were provided
unique_ptr(const unique_ptr&) = delete;
^
1 error generated.
你的lock_scope类型被声明为包装指向std::atomic<int>*的指针,即std::atomic<int>** 。 free_lock声明和定义正确地反映了这一点。
但是,然后你尝试用指向std::atomic<int>的指针初始化lock_scope (少一个间接lock_scope )。
编译器消息很清楚地表明:
[...] candidate constructor not viable:
no known conversion from 'std::atomic *' to 'pointer' (aka 'std::atomic **') [...]
您要么为包装的lck需要额外的间接lock_scope , free_lock将lock_scope和free_lock更改为少用一个间接free_lock 。
你可以转换返回lock_scope(..); 返回std :: move(lock_scope(...));
因为std :: unique_ptr :: operator =(const std :: unique_ptr&)是私有的;
链接地址: http://www.djcxy.com/p/66737.html上一篇: error using static function deleter with std::unique
下一篇: C++ error in ios
