在我正在维护的一个应用程序中,我遇到了一个持久化类,它有6个函数,除了要持久化的项的类型之外,所有函数都做了相同的事情。这些项都是相同的基类-模板函数的候选项。
然而,一旦我转换了它们,当函数进入到要写入的容器中时,似乎总是空的(正在创建临时副本?)尽管事实上它应该有几个项目。可以肯定的是,在调试器中检查容器时,它没有包含任何项。写入函数还会触发一个事件,通知客户端状态发生变化,但当该线程从deque中提取项目时,它现在总是为空。
基类称为CItem,所有其他项都是该项的特殊项(
CErrorItem
等)。它们都是以一种颜色存在的(
std::deque<std::tr1::shared_ptr<CItem>> m_items;
),和到磁盘。项目已正确写入磁盘。正确处理后,将从磁盘和磁盘中删除项目。
项目与代码一起添加
m_persistence.Add<CErrorItem>(errorItem);
项目的所有数据都存储在简单结构中(例如
ErrorItemInfo
),这些项将这些简单的数据存储在其构造函数中。该结构由
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;
}
最简单的解决方案是将代码还原回特定的函数,我可能会这样做,但我想了解为什么会发生这种情况,以便将来可以避免这种情况。