@@ -100,19 +100,10 @@ class NamedObjectVector {
100100 // / destroyed. The object holder (unique_ptr) is returned
101101 // / to caller for further finalization
102102 template <typename T>
103- std::unique_ptr<T> DeleteObj (const std::string &name) {
104- auto oldObjPtr = DeleteObj<NamedObject>(name);
105- auto oldDerivedPtr = oldObjPtr ?
106- dynamic_uptr_cast<T>(std::move (oldObjPtr)) :
107- std::unique_ptr<T>();
108- return std::move (oldDerivedPtr);
109- }
103+ std::unique_ptr<T> DeleteObj (const std::string &name);
110104
111- // DeleteObj explicit instantiation for NamedObject
112- template <>
113- NamedObjectUPtr DeleteObj<NamedObject>(const std::string &name);
114-
115-
105+ template <> // Specialization for NamedObject; other types will rely on it
106+ std::unique_ptr<NamedObject> DeleteObj<NamedObject>(const std::string &name);
116107
117108 void DeleteObjs (const std::vector<std::string> &names);
118109
@@ -185,11 +176,15 @@ template<>
185176std::tuple< NamedObject&, std::unique_ptr<NamedObject> >
186177NamedObjectVector::DefineObj (std::unique_ptr<NamedObject>&& obj);
187178
188- // Specialization (declaration) of DeleteObj for NamedObject class, so that
189- // derived classes can rely on it
190- template <>
191- std::unique_ptr<NamedObject>
192- NamedObjectVector::DeleteObj (const std::string &name);
179+ // Out-of-class definition for DeleteObj
180+ template <typename T>
181+ std::unique_ptr<T> NamedObjectVector::DeleteObj (const std::string &name) {
182+ auto oldObjPtr = DeleteObj<NamedObject>(name);
183+ auto oldDerivedPtr = oldObjPtr ?
184+ dynamic_uptr_cast<T>(std::move (oldObjPtr)) :
185+ std::unique_ptr<T>();
186+ return std::move (oldDerivedPtr);
187+ }
193188
194189} // Namespace luxrays
195190
0 commit comments