gpt4 book ai didi

c++ - 将 boost::ptr_vector 添加到双端队列,typeid 不匹配

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:37:05 24 4
gpt4 key购买 nike

我正在尝试使用 push_back() 将 boost::ptr_vector 添加到 std::deque。当我这样做时,我得到了一个 BOOST::ASSERT 类型 ID 不匹配。

在“boost_ptr_container_clone_allocator”中

     T* res = new T( r );
BOOST_ASSERT( typeid(r) == typeid(*res) &&
"Default new_clone() sliced object!" );
return res;

从 TotalView、resr:

Function "boost::new_clone<diagnostic_database_loader::DiagnosticDBClass>":
r: (diagnostic_database_loader::DiagnosticDBClass const &)
Local variables:
res: 0x082534f8 -> (diagnostic_database_loader::DiagnosticDBClass)

它们在我看来是一样的。

我尝试添加的 ptr_vector 具有 diagnostic_database_loader::JointDiagnosticDBClass 的实例,它派生自上面的 diagnostic_database_loader::DiagnosticDBClass

我打印出了ptr_vector中元素的typeid

boost::ptr_vector<DiagnosticDBClass> items(loader->getData());
>>> N26diagnostic_database_loader22JointDiagnosticDBClassE

我试着用一个简单的测试程序重现这个,但我没有遇到同样的问题。

#include "iostream"
#include <boost/ptr_container/ptr_vector.hpp>
#include <deque>

class Item
{
public:
int my_val;
Item() : my_val(1) { }

int getMyVal() { return my_val; }
};
class SmallItem : public Item
{
public:
SmallItem() : Item() { my_val = 2; }
};

class TinyItem : public SmallItem
{
public:
TinyItem() : SmallItem() { my_val = 3; }
};

class MyClass
{
private:
boost::ptr_vector<SmallItem> items_;

public:
MyClass()
{
for (int i = 0; i < 10; ++i)
{
SmallItem *it = new TinyItem();
items_.push_back(it);
}
}

std::auto_ptr<boost::ptr_vector<SmallItem> > getData() { return items_.release(); }
};

std::deque<boost::ptr_vector<SmallItem> > Buffer;

int totalItems(boost::ptr_vector<SmallItem> &items)
{
int total = 0;
boost::ptr_vector<SmallItem>::iterator it;
for (it = items.begin(); it != items.end(); ++it)
total += (*it).getMyVal();
return total;
}

int main(int argc, char **argv)
{
MyClass cls;

boost::ptr_vector<SmallItem> items(cls.getData());

std::cout << "SmallItem typeid " << typeid(items[0]).name() << std::endl;

fprintf(stdout, "I found %d total!\n", totalItems(items));

Buffer.push_back(items);

fprintf(stdout, "I pushed back into the deque!\n");

boost::ptr_vector<SmallItem> items2 = Buffer.front();
Buffer.pop_front();
fprintf(stdout, "I still found %d total in the new vector!\n", totalItems(items2));

items2.release();
fprintf(stdout, "I found %d total after I released!\n", totalItems(items2));

return 0;
}

测试程序运行良好。

有没有人知道怎么办
* 重现测试代码中的问题?
* 修复真实程序中的问题?

如果有人想要完整的代码:
https://code.ros.org/svn/wg-ros-pkg/trunk/sandbox/diagnostic_database_loader

最佳答案

您应该按照 documentation 中的描述专门化 new_clonedelete_clone 函数.

或者您可以指定自己的 clone allocator作为 ptr_vector 的第二个参数:

class Item
{
public:
int my_val;
Item() : my_val(1) { }

Item* clone() const
{
Item* item = do_clone();
BOOST_ASSERT(typeid(*this) == typeid(*item) &&
"do_clone() sliced object!");
return item;
}

int getMyVal() { return my_val; }

private:
// new virtual member function, overload in all derived classes.
virtual Item* do_clone() const
{
return new Item(*this);
}
};

class SmallItem : public Item
{
public:
SmallItem() : Item() { my_val = 2; }

private:
virtual Item* do_clone() const
{
return new SmallItem(*this);
}
};

struct ItemCloner
{
static Item* allocate_clone(const Item& item)
{
return item.clone();
}

static void deallocate_clone(const Item* item)
{
delete item;
}
};

int main()
{
boost::ptr_vector<Item, ItemCloner> items;
// and so on...
}

关于c++ - 将 boost::ptr_vector 添加到双端队列,typeid 不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2278966/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com