代码之家  ›  专栏  ›  技术社区  ›  graham.reeds

模板化函数似乎创建了临时容器

  •  0
  • graham.reeds  · 技术社区  · 15 年前

    在我正在维护的一个应用程序中,我遇到了一个持久化类,它有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;
    }
    

    最简单的解决方案是将代码还原回特定的函数,我可能会这样做,但我想了解为什么会发生这种情况,以便将来可以避免这种情况。

    1 回复  |  直到 15 年前
        1
  •  0
  •   Joris Timmermans    15 年前
    shared_ptr<T> is a potentially different type to shared_ptr<CItem>
    

    是不是因为你的整个持久性课程都在为每一个T变得专业化?