【问题标题】:error using static function deleter with std::unique_ptr使用带有 std::unique_ptr 的静态函数删除器时出错
【发布时间】:2013-02-01 05:01:06
【问题描述】:

我有以下代码 sn-p 无法编译......似乎应该,但它现在回避了我。非常感谢任何帮助/建议!

#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)>”) 返回 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) noexcept ^ /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) noexcept ^ /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/bits/unique_ptr.h:114: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(pointer __p) noexcept ^ /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) noexcept ^ /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 个错误。

【问题讨论】:

  • 我不明白任何人如何发布有关无法编译且不包含编译器错误消息的代码的问题...

标签: c++ unique-ptr


【解决方案1】:

您的lock_scope 类型被声明为包装指向std::atomic&lt;int&gt;* 的指针,即std::atomic&lt;int&gt;**free_lock 声明和定义正确地反映了这一点。

但随后您尝试使用指向 std::atomic&lt;int&gt; 的指针初始化 lock_scope(少一个间接)。

编译器消息非常清楚地说明了这一点:

[...] candidate constructor not viable: 
no known conversion from 'std::atomic *' to 'pointer' (aka 'std::atomic **') [...]

您需要为包装后的 lck 提供额外的间接寻址,或者更改 lock_scopefree_lock 以减少使用一个间接寻址。

【讨论】:

    【解决方案2】:

    你可以转换 return lock_scope(..);返回 std::move( lock_scope(...) );

    因为 std::unique_ptr::operator = (const std::unique_ptr& ) 是私有的;

    【讨论】:

    • 对不起,我当时没有看到错误信息。
    猜你喜欢
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 2016-03-31
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    相关资源
    最近更新 更多