3
class BaseShader {
        std::unique_ptr<HandleInterface> handle_;
    public:
        BaseShader();
        BaseShader(std::unique_ptr<HandleInterface> handle_ptr);

.cpp

BaseShader::BaseShader(std::unique_ptr<HandleInterface> handle_ptr) {
    handle_.reset(handle_ptr.get());
}
//BaseHandle implements HandleInterface
BaseShader::BaseShader():BaseShader(std::make_shared<BaseHandle>()) {
}

handle_unique_ptrを正しく初期化するにはどうすればよいですか?

こんな感じで使いたいBaseShader s(std::make_shared<BaseHandle>());

クランが教えてくれる

error: no matching constructor for initialization of 'BaseShader'
BaseShader::BaseShader():BaseShader(std::make_shared<BaseHandle>()) {
                         ^          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

私はおそらくそれを台無しにしました。

1.) コンストラクターの引数は正しいですか?BaseShader::BaseShader(std::unique_ptr<HandleInterface> handle_ptr)

2.) 1.) が true の場合handle_.reset(handle_ptr.get());、handle_unique_ptr を初期化する正しい方法は?

4

2 に答える 2

11

まず第一にstd::move、コンストラクターの引数からhandle_メンバー初期化リストに入れる必要があります。

BaseShader::BaseShader(std::unique_ptr<HandleInterface> handle_ptr)
  : handle_(std::move(handle_ptr))
{ }

次に、std::make_sharedが必要なshared_ptrときにを提供しますunique_ptr。残念ながら、std::make_unique(まだ) はないので、次のようにする必要があります。

BaseShader::BaseShader()
  : BaseShader(std::unique_ptr<BaseHandle>(new BaseHandle()))
{ }

BaseHandleこれは、が から派生した場合にのみ機能しHandleInterfaceます。

于 2013-05-10T23:12:38.427 に答える