У меня есть Object Factory Class, у которого есть метод с именем registerCreator, как определено ниже:
template < class Base, class Key, typename ObjectCreator = Base* (*)()>
class ObjectFactory
{
public:
bool registerCreator( const Key& id, ObjectCreator creator)
{
return associations_.insert( typename IdToObjectMap::value_type(id, creator)).second != 0;
}
...
private:
typedef std::map<Key, ObjectCreator> IdToObjectMap;
IdToObjectMap associations_;
};
Этот класс заключен в одноэлементный Holder, который по существу реализован после Loki :: SingletonHolder.
Я создал typedef для этого как:
typedef SingletonHolder < ObjectFactory < AbstractResource, const char*, AbstractResource* (*)()> > ResourceFactory;
AbstractResource - пока пустой класс.
Я использовал другой класс ResourceBase, чтобы помочь со статическим полиморфизмом.
template <class DerivedType>
class ResourceBase
{
public:
virtual ~ResourceBase();
static bool registerWithFactory();
protected:
ResourceBase();
private:
static const bool _Initialized;
};
// это также включает его реализацию .C, которая выглядит следующим образом:
template <class DerivedType>
const bool ResourceBase<DerivedType>::_Initialized =
ResourceBase<DerivedType>::registerWithFactory();
template<class DerivedType>
bool ResourceBase<DerivedType>::registerWithFactory()
{
if (! _Initialized)
{
return ResourceFactory::Instance().template registerCreator<DerivedType> (DerivedType::className() , &DerivedType::allocate);
}
}
и тогда мой конкретный класс выглядит следующим образом:
Класс FileManager: общедоступный ResourceBase, AbstractResource
{
общественности:
Файловый менеджер();
~ FileManager () {}
static const char* className();
static AbstractResource* allocate();
};
С реализацией FileManager как:
const char* FileManager::className()
{
return "FileManager";
}
AbstractResource* FileManager::allocate()
{
return new FileManager;
}
при компиляции я получаю:
error: no matching function for call to `ObjectFactory<AbstractResource, const char*, AbstractResource*(*)()>::registerCreator(const char*, AbstractResource*(*)())'
Может кто-нибудь предложить, в чем здесь проблема? Я скучаю по чему-то очень простому, как кажется.