使用std::unique_ptr的静态函数deleter时出错
error using static function deleter with std::unique_ptr
我有以下代码段编译失败。。。看起来应该这样,但它现在在回避我。非常感谢您的帮助/建议!
#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 报告了以下错误消息
编译已完成,但有错误:source.cpp:13.23:错误:没有用于初始化"lock_scope"(又名"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:注意:候选构造函数不可行:第一个参数没有从"std::atomic*"到"pointer"(也称为"std:::atomic**")的已知转换unique_ptr(指针__p,^/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../include/c++/4.7/bits/unique_ptr.h:125:7:注意:候选构造函数不可行:第一个参数没有从"std::atomic*"到"pointer"(也称为"std::atomic**")的已知转换unique_ptr(指针__p,^/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../include/c++/4.7/bits/unique_ptr.h:155:2:注意:候选构造函数模板不可行:需要单个参数'__u',但提供了2个参数unique_ptr(unique_ptr&&__u)不例外^/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../include/c++/4.7/bits/unique_ptr.h:164:2:注意:候选构造函数模板不可行:需要单个参数'__u',但提供了2个参数unique_ptr(auto_ptr&&__u)无异常^/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../include/c++/4.7/bits/unique_ptr.h:111:17:注意:候选构造函数不可行:需要0个参数,但提供了2个constexpr unique_ptr()noexcept^/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../include/c++/4.7/bits/unique_ptr.h:120:7:注意:候选构造函数不可行:需要单个参数'__p',但提供了2个参数unique_ptr(指针__p)无异常^/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../include/c++/4.7/bits/unique_ptr.h:136:17:注意:候选构造函数不可行:需要1个参数,但提供了2个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:注意:候选构造函数不可行:需要单个参数'__u',但提供了2个参数unique_ptr(unique_ptr&&__u)不例外^/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../include/c++/4.7/bits/unique_ptr.h:262:7:注意:候选构造函数不可行:需要1个参数,但提供了2个unique_ptr(const unique_ptr&)=删除;^生成1个错误。
您的lock_scope
类型被声明为包装指向std::atomic<int>*
的指针,即std::atomic<int>**
。free_lock
声明和定义正确地反映了这一点。
但是,您尝试使用指向std::atomic<int>
的指针初始化lock_scope
(少一个间接指针)。
编译器消息相当清楚地表明:
[...] candidate constructor not viable:
no known conversion from 'std::atomic *' to 'pointer' (aka 'std::atomic **') [...]
您需要为封装的lck
增加一个间接寻址,或者将lock_scope
和free_lock
更改为少使用一个间接重定向。
您可以转换返回的lock_scope(..);返回std::move(lock_scope(…));
因为std::unique_ptr::operator=(const std::unique_ptr&)是私有的;
相关文章:
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 检查编译时是否存在静态函数
- 名称隐藏对静态函数继承的实例使用
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 类中静态函数C++意外结果
- 在工人类中使用不同类的静态函数进行实验
- 类 Referention 中C++回调函数引用非静态函数
- 指向模板上下文中的成员函数或静态函数的指针
- 如何检测 Clang AST C++中的静态函数
- 内联asm编译器屏障(内存阻塞器)是算作外部函数,还是算作静态函数调用
- 如何在静态函数中使用成员函数数组
- (2 问题)"类"类型重新定义(即使 #pragma 一次),以及静态函数内的静态成员对象初始化?
- 生成代码(在编译时)以调用模板的每个实例化的静态函数
- C++无法访问或使用静态函数
- 如何将 cpp 文件中的静态函数公开给其他文件
- 将函数的引用设置为其他 c++ 文件中的非静态函数
- 方法的静态函数的等价性
- 扩展包含静态函数的类
- 非静态函数可以访问静态变量吗?
- 使用std::unique_ptr的静态函数deleter时出错