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);
}

};

次のエラーメッセージはClang3.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(pointer __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(pointer __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

あなたの型は、へのポインタ、つまり alock_scopeをラップするように宣言されています。宣言と定義はそれを正しく反映しています。std::atomic<int>*std::atomic<int>**free_lock

しかし、その後lock_scope、ポインタのみを使用してを初期化しようとしますstd::atomic<int>(間接参照が 1 つ少なくなります)。

コンパイラのメッセージには、かなり明確に次のように記載されています。

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

lckラップまたは変更のために追加の間接化が必要であり、lock_scope使用free_lock する間接化が 1 つ少なくなります。

于 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 に答える