Сделал частитчно менеджер загрузки спрайтов и моделей 3d. Загружается через load_manager. Вот так.
Sprite *sp = load_manager<Sprite>::getModel ( "schar_00" );
А вот код класс load_manager.
#include "object.h"
#include "model.h"
#include "sprite.h"
#include <map>
#include <string>
template<typename T>
class load_manager {
private:
static std::map <std::string,Object *> map;
public:
static T *getModel ( const char *s ) {
std::string path ( s );
T *view = map [ path ];
if ( view ) return view;
view->read_file ( s );
map [ path ] = view;
return view;
}
};
Так как я создал std::map < object * >, то хотел бы, чтобы T *view = map [ path ] работала. Почему не может быть преобразована, если Sprite наследуется от Object? Как мне решить эту проблему?
Сделал преобразование, теперь ошибки такие.
/tmp/ccyZsl4K.o: In function `load_manager<Sprite>::getModel(char const*)':
/home/cf/projects/editor/./src/menu/../engine/load_manager.h:14: undefined reference to `load_manager<Sprite>::map[abi:cxx11]'
/home/cf/projects/editor/./src/menu/../engine/load_manager.h:18: undefined reference to `load_manager<Sprite>::map[abi:cxx11]'
Что указывает на строки где было преобразование.
Так как load_manager содержит и работает с конкретными типами, то сделать его шаблонным не имеет никакого смысла. Его статический член map является таблицей, для которого mapped_type есть Object*, и он может содержать и адреса своих производных классов, так что при инициализации вы можете туда записать и Sprite*, но вы не можете без явного преобразования присвоить указателью Sprite* указатель на Object, но наоборот можно. Вы могли бы написать так:
class load_manager {
private:
static std::map <std::string, Object*> map;
public:
static Object* getModel(const char* s) {
std::string path(s);
if (!map[path])
map[path]->read_file(s);
return map[path];
}
};
И...
Object* sp = load_manager::getModel("schar_00");
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости