在我维护的应用程序中,我遇到了一个持久化类,它有6个函数,除了持久化的项目类型外,它们都做了同样的事情。这些项目都是相同的基类 - 模板函数的候选者。
然而,一旦我转换它们,似乎当函数进入正在写入的容器时总是为空(创建临时副本?),尽管它应该有几个项目。可以肯定的是,检查调试器中的容器它有零项。此外,写入函数会触发一个事件,通知客户端状态发生变化,但当该线程从双端队列中提取项目时,它现在总是为空。
基类称为CItem,所有其他项目都是该项目的专长(CErrorItem
等)。它们都存在于双端队列(std::deque<std::tr1::shared_ptr<CItem>> m_items;
)和磁盘中。项目正确写入磁盘。正确处理后,将从双端队列和磁盘中删除项目。
使用代码m_persistence.Add<CErrorItem>(errorItem);
项目的所有数据都存储在简单的结构中(例如ErrorItemInfo
),而Items将这些简单的数据存储放在它们的构造函数中。这个结构由下面的代码中的U
表示。 T
是派生的CItem
。
添加项目的功能如下:
template <typename T, typename U>
std::tr1::shared_ptr<T> CPersistenceManager::Add(const U& item)
{
std::tr1::shared_ptr<T> newItem = std::tr1::shared_ptr<T>(new T(item));
// .. a couple of lines calling helper functions to generated a unique timestamped filename
newItem->Write(filename); // this writes to disk and works.
m_items.push_back(newItem); // m_items is always empty
SetEvent(m_itemAddedEvent); // notify the client an item has been added.
return newItem;
}
最简单的解决方案是将代码恢复为特定功能,我可能会这样做,但我想了解为什么会发生这种情况,以便将来可以避免使用。
答案 0 :(得分:0)
shared_ptr<T> is a potentially different type to shared_ptr<CItem>
你的整个持久化课程是否适合每一个T?