试图将元素推入向量

时间:2014-06-29 09:14:23

标签: c++ vector stl explicit

在头文件中(我还没写过),结构已经像这样定义了

struct MemoryMessage : public boost::counted_base { /*, public FastAlloc*/
  explicit MemoryMessage(MemoryMessageType aType)
   : theType(aType) {}
  explicit MemoryMessage(MemoryMessageType aType, MemoryAddress anAddress)
   : theType(aType) {}
  explicit MemoryMessage(MemoryMessageType aType, MemoryAddress anAddress, int anIdentifier)
   : theType(aType) {}
  explicit MemoryMessage(MemoryMessageType aType, MemoryAddress anAddress, VirtualMemoryAddress aPC)
   : theType(aType) {}
  explicit MemoryMessage(MemoryMessageType aType, MemoryAddress anAddress, VirtualMemoryAddress aPC, DataWord aData)
   : theType(aType) {}
  explicit MemoryMessage(MemoryMessage & aMsg)
   : theType(aMsg.theType) {} 
}

后来在我的代码中,我写了

MemoryMessage testMsg;
class foo() {
  foo()
   : testMsg(MemoryMessage::test)
  {}
  std::vector< MemoryMessage > candidates;

  void bar() {
     candidates.push_back(testMsg);   
  }
}

但是我收到了这个错误

error: no matching function for call to 'MemoryMessage::MemoryMessage(const MemoryMessage&)’
note: candidates are:MemoryMessage::MemoryMessage(MemoryMessage&)

这有什么问题?我创建了一个非常小的片段。如果我在解释中错过了一些内容,请告诉我。

1 个答案:

答案 0 :(得分:3)

场景后面的这一行调用了一个复制构造函数:

candidates.push_back(testMsg);   

通过调用testMsg代码中的复制构造函数,将push_back const引用的std::vector放入向量中。但是,您的构造函数被声明为explicit,因此std::vector的代码无法访问它。

从复制构造函数中删除explicit指示符将解决此问题。