【问题标题】:Pass vector of pointers by reference and replace a vector of void* pointers通过引用传递指针向量并替换 void* 指针向量
【发布时间】:2013-05-18 17:09:20
【问题描述】:

我有以下结构:

typedef struct{
int pktType;
void* sourcePeer;
void* destPeer;
void* aboutPeer;
int tree;
std::vector<int> cogSize; //LEAVE ?
std::vector<void*> newParents; //JOIN_REP
}packet;

另外,我有一个名为base_peer的类,声明如下:

class base_peer
{
    ...
public:
virtual void createMessage(int, base_peer*, base_peer*, base_peer*, int, std::vector<int>&, std::vector<base_peer*>&, packet*);
    ...
}

createMessage()函数定义如下:

void base_peer::createMessage(int msgType, base_peer* msgSourcePeer, base_peer* msgDestPeer, base_peer* msgAboutPeer, int msgAboutTree, std::vector<int>& msgCogSize, std::vector<base_peer*>& newParents, packet* newPacket)
{
    newPacket->pktType = msgType;
    newPacket->sourcePeer = msgSourcePeer;
    newPacket->destPeer = msgDestPeer;
    newPacket->aboutPeer = msgAboutPeer;
    newPacket->tree = msgAboutTree;
    newPacket->cogSize = msgCogSize;
    newPacket->newParents = newParents;
}     

我希望createMessage 创建一个数据包结构并为其元素分配值。更具体地说,当我尝试将向量std::vector&lt;void*&gt; newParents 分配给向量std::vector&lt;base_peer*&gt;&amp; newParents 时,就会发生错误。

我从 Eclipse 收到以下错误:

从 'std::vector' 到参数 1 的未知转换 'const std::vector&'

std::vector<_tp _alloc>& std::vector<_tp _alloc>::operator=(const std::vector<_tp _alloc>&) [with _Tp = void*; _分配= std::allocator]

'newPacket->packet::newParents = 中的 'operator=' 不匹配 newParents'base_peer.cpp

感谢您的帮助。

【问题讨论】:

  • 为什么是void*?这对我来说是一种代码味道。
  • 实际上我正在使用void*,因为我有一个循环依赖问题:struct packet 应该知道base_peer 类和相反。我找不到解决办法。
  • @user2397244:试试vector&lt;class base_peer*&gt; 而不是vector&lt;void*&gt;
  • @user2397244:也许你应该先问一个关于这个问题的问题。
  • @BenjaminLindley 你可能是对的:我认为 void 指针可以解决最初的问题......

标签: c++


【解决方案1】:

您必须手动复制元素,或使用迭代器。最简单的方法是使用std::vectorassign成员函数。

newPacket->newParents.assign(newParents.begin(), newParents.end());

这只是因为任何指针都可以直接转换为 void 指针。如果要转换 from void 指针,则需要使用强制转换,可以使用 std::transform

【讨论】:

    【解决方案2】:

    模板实例化后,vector&lt;void*&gt;vector&lt;base_peer*&gt; 是完全不同的具体类,完全没有继承关系。除非定义了赋值运算符,否则它将不起作用。

    您可以执行newPacket-&gt;newParents[index] = newParents[index];,因为这会将指针分配给通用指针。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-14
      • 2022-01-12
      • 1970-01-01
      • 2011-08-04
      • 1970-01-01
      • 2011-04-20
      相关资源
      最近更新 更多