Hello,
I'm trying to implement a system of resource managers. There's a ResourceManager template and its templated member function which will attempt to create a resource from whatever _Creator had been passed (if the given resource can use the given creator class). The _Creator is just an aggregation of information to be used, by the _Resource.
There's also a ResourceIndexer class which derives (implemented-in-terms-of) from ResourceManager. Has an additional template parameter which defines a type which will be a key type (but is also a _Creator).
In the ResourceIndexer's case, I need to apply specialization to the Manage() template member function: when a _Creator of type _Index had been passed, the Indexer has to use it for indexing. For the rest of the cases it just calls ResourceManager::Manage().
When I try the following,
template <class _Resource>
class ResourceManager
{
public:
template <typename _Creator>
Handle Manage(_Creator c) { ... };
};
template <class _Resource, typename _Index>
class ResourceIndexer : protected ResourceManager<_Resource>
{
public:
template <typename _Creator>
Handle Manage(_Creator c) { return ResourceManager<_Resource>::Manage(c) };
template <>
Handle Manage<_Index>(_Creator c) { ... };
};
or
template <class _Resource, typename _Index>
class ResourceIndexer : protected ResourceManager<_Resource>
{
public:
template <typename _Creator>
Handle Manage(_Creator c) { ... };
};
template <_Resource, _Index>
Handle ResourceIndexer<_Resource, _Index>::Manage<_Index>(_Creator c) { ... };
or
template <_Resource, _Index>
Handle ResourceIndexer<_Resource, _Index>::Manage<>(_Creator c) { ... };
I get different compiler errors, respectively,
/Volumes/PROJECTS/Development/manager.hpp:265: error: invalid explicit specialization before '>' token
/Volumes/PROJECTS/Development/manager.hpp:265: error: explicit specialization in non-namespace scope 'class XR::ResourceIndexer<_Resource, _Index>'
/Volumes/PROJECTS/Development/manager.hpp:265: error: enclosing class templates are not explicitly specialized
/Volumes/PROJECTS/Development/manager.hpp:266: error: invalid member function declaration
and
/Volumes/PROJECTS/Development/manager.hpp:329: error: template-id 'Manage<_Index>' in declaration of primary template
/Volumes/PROJECTS/Development/manager.hpp:329: error: prototype for 'XR::Handle XR::ResourceIndexer<_Resource, _Index>::Manage(const _Creator&, XR::Handle)' does not match any in class 'XR::ResourceIndexer<_Resource, _Index>'
/Volumes/PROJECTS/Development/manager.hpp:260: error: candidate is: template<class _Resource, class _Index> template<class _Creator> XR::Handle XR::ResourceIndexer::Manage(const _Creator&, XR::Handle)
/Volumes/PROJECTS/Development/manager.hpp:329: error: template definition of non-template 'XR::Handle XR::ResourceIndexer<_Resource, _Index>::Manage(const _Index&, XR::Handle)'
Reading around I've found that template specialization has to be defined in their enclosing namespaces, that's why I moved it outside in the second attempt -- but that way the compiler didn't seem to recognize the function as a template member function in the first place.
How is this doable? What's the correct syntax / approach?
Many thanks for your help.