Вы не сказали, что означает "не работает"; это не компилируется? Это не загружает / хранит значение правильно? Это не .. что?
Здесь я могу выделить две проблемы, одна из которых может быть частью вашего намеренного замысла.
Во-первых, вы не сделали правильный указатель в процедуре загрузки. Давайте разберемся с этим:
inline void serialize(Archive & ar, std::shared_ptr<T> &t, const unsigned int version) {
if (1) { //unimportant
T* r;
ar >> r;
t = r;
}
}
Когда вы создаете объект из std :: shared_ptr, вы создаете экземпляр шаблона класса, чтобы обеспечить возможность указателя (как вы знаете). Если вы сделали с int, он будет работать как указатель int. Однако простая передача типа как T НЕ означает, что созданный указатель этого типа будет автоматически использовать этот шаблон; действительно, вы создаете пустой указатель с помощью T * r. Это также может быть int * r. Вы тогда не можете инициализировать это с новым; г может указывать куда угодно. Если он был правильно инициализирован с новым, вы МОЖЕТЕ получить правильный подсчет ссылок для создания / удаления этого объекта; это одна из областей, где std :: shared_ptr не кажется мне стоящим. Я думаю, что назначение с пустым указателем считается второй ссылкой, а не первой, но я могу ошибаться? Во всяком случае, это не проблема. Вы, вероятно, портите кучу; компилятор должен выдавать предупреждение об использовании неинициализированного указателя, это удивительно, что это не так. Надеюсь, у вас не отключены предупреждения.
Если я правильно помню, эту декларацию r необходимо заменить на:
std::shared_ptr<T> r = new std::shared_ptr<T>;
Хотя это может быть
std::shared_ptr<T> r = new std::shared_ptr<T>(r());
Я некоторое время не использовал shared_ptr.
TR1, между прочим, отсутствовал как минимум 2 года. Это основано на Boost's shared_ptr. Я не знаю, почему вы используете Boost 1.46, но я думаю, что он вышел к тому времени, когда shared_ptr стал частью стандарта? Так должно быть совместимо ...?
Так или иначе, вторая потенциальная ошибка приходит с
t = r;
Я предполагаю - неправильно? - что вы хотите уменьшить счетчик ссылок на t, переназначив его (и, возможно, уничтожив объект, на который указывает t). Если вы хотите скопировать его, вы, конечно, будете использовать:
*t = *r;
и убедитесь, что ваш конструктор копирования работает правильно.