#include template void utilspp::setLongevity(T * obj, unsigned int longevity, TDestroyer d) { using namespace utilspp::PrivateMembers; TrackerArray newArray = static_cast( std::realloc(mTrackerArray, mNbElements + 1)); if(newArray == NULL) { throw std::bad_alloc(); } LifetimeTracker * p = new ConcreteLifetimeTracker(obj, longevity, d); mTrackerArray = newArray; TrackerArray pos = std::upper_bound( mTrackerArray, mTrackerArray + mNbElements, p, &LifetimeTracker::compare); std::copy_backward( pos, mTrackerArray + mNbElements, mTrackerArray + mNbElements + 1); *pos = p; mNbElements++; std::atexit(&atExitFunc); }; template void utilspp::LifetimeWithLongevity::scheduleDestruction(T * obj, void (* func)()) { utilspp::PrivateMembers::adapter adapter = { func }; utilspp::setLongevity(obj, getLongevity( obj ), adapter); } template void utilspp::LifetimeWithLongevity::onDeadReference() { throw std::logic_error("Dead reference detected"); } template unsigned int utilspp::getLongevity(T *) { return 1000; }