1

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

#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' (aka '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 个错误。
4

2 回答 2

1

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

但是随后您尝试lock_scope使用仅指向 a 的指针来初始化std::atomic<int>(少一个间接)。

编译器消息相当清楚地表明:

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

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

于 2013-02-16T10:08:26.533 回答
0

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

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

于 2013-02-16T07:25:52.960 回答