使用unique_ptr编译错误

时间:2017-08-26 19:41:22

标签: c++ c++11 smart-pointers stdvector unique-ptr

任何想法为什么不编译:

(ns clj.core
 (:import
  (com.ibm.watson.developer_cloud.conversation.v1 ConversationService)
  (com.ibm.watson.developer_cloud.conversation.v1.model MessageRequest)
  (com.ibm.watson.developer_cloud.conversation.v1.model MessageResponse)))

(let [username "foo"
     password "bar"
     input "hello"
     context {}
     workspaceId "ibm-watson-id"
     service (ConversationService. "2017-08-26")
     userPass (.setUsernameAndPassword service username password)

     ;just wanna make it work
     msgReq (MessageRequest$Builder.)
     inputText (.inputText msgReq input)
     content (.context inputText context)
     newMessage (.build content)
     response (.execute (.message service workspaceId newMessage))]
   (println  "Watson Response: " response))

我明白了:

  

错误:没有用于初始化'B'B b = createB();

的匹配构造函数

此外,对于此示例,是否有更好的方法来保持对象的向量?请注意,我故意在函数中创建对象,以便在销毁B之前删除传递给B类的对象。在这种情况下,引用包装器不起作用,因为它指向已经删除的对象。我尝试通过引入unique_ptr来解决这个问题,但后来我遇到了这个错误。

2 个答案:

答案 0 :(得分:3)

B不可复制,因为它包含不可复制的std::vector<std::unique_ptr<A>>

您的“复制构造函数”实际上不是复制构造函数。将其更改为:

B(const B & b ) {
  for( const std::unique_ptr< A >& val: b.m_Array ) {
    m_Array.push_back( std::unique_ptr< A >( new A( *val ) ) );
  }
}
  • const B& b代替参数<{li>中的B& b
  • const std::unique_ptr<A>& val:代替std::unique_ptr<A>& val:
  • 因为向量不可复制,所以编译器没有为B生成复制构造函数,createB作为临时函数返回的类型不能绑定到非const引用。

Demo

答案 1 :(得分:-1)

如果您想要移动&#34;手动创建课程。他们,然后你可以移动指针。由于您有不可移动的对象,因此无法移动它们,但您可以移动它们的指针,但您必须使用newmalloc手动分配它们,以便在以下位置删除对象功能范围createB()的结束。

你手动创建这样的类:

B *pointerToB = new B;

在您的代码中:

B createB() {
    B *b = new B;
    A a1;
    A a2;
    b->add( a1 );
    b->add( a2 );
    return b;
}

int main() {
    B *b = createB();
    A& temp = b->get( 1 );
    temp.play();

    delete b; // Do not forget to delete manually allocated object !!
    return 0;
}

最后你需要用指针删除对象:

delete pointerToB;