шаблонная функция, по-видимому, создает временный контейнер - PullRequest
0 голосов
/ 22 ноября 2010

В приложении, которое я поддерживаю, я наткнулся на класс персистентности, в котором было 6 функций, которые выполняли одно и то же, за исключением типа сохраняемого элемента. Все эти элементы принадлежат к одному базовому классу - кандидату на функцию шаблона.

Однако после того, как я их преобразовал, может показаться, что когда функция входит в контейнер, в который выполняется запись, она всегда пуста (создается временная копия?), Несмотря на то, что в ней должно быть несколько элементов. Чтобы быть уверенным, осматривая контейнер в отладчике, он имеет ноль предметов. Также функция записи запускает событие, которое уведомляет клиента об изменении статуса, но когда этот поток идет, чтобы извлечь элемент из очереди, он всегда теперь пуст.

Базовый класс называется CItem, а все остальные предметы являются специальностями этого предмета (CErrorItem и т. Д.). Все они сохраняются как в деке (std::deque<std::tr1::shared_ptr<CItem>> m_items;), так и на диске. Элементы записаны на диск правильно. После правильной обработки элементы удаляются как из deque, так и с диска.

Элементы добавляются с кодом 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 Ответ

0 голосов
/ 22 ноября 2010
shared_ptr<T> is a potentially different type to shared_ptr<CItem>

Может ли быть так, что весь ваш класс персистентности становится специализированным для каждого T?

...