currentTower = std::make_shared<tower>(jakisTower);
jakisTower to przecież shared_ptr, a argumenty make_shared zostaną przekazane do konstruktora tower. Kompilator dobrze zauważa, że nie ma konstruktora tower(std::shared_ptr<tower>). Więc jak już to tak:
currentTower = std::make_shared<tower>(*jakisTower);
Tyle, że make_shared uruchomi konstruktor tower. Jeśli jakisTower wskazywał na obiekt arcaneTower, to powyższa linijka nie stworzy dla ciebie drugiego obiektu arcaneTower, a jedynie przekopiuje pola odpowiadające klasie tower do nowego obiektu tower.
Więc jeśli chcesz się przed tym zabezpieczyć, to musisz powiedzieć kompilatorowi jakiej klasy obiekt chcesz stworzyć. Sam musisz o to zadbać np. dynamic_cast-em:
if(arcaneTower * ptr = dynamic_cast<arcaneTower *>(jakisTower.get())
currentTower = std::shared_ptr<tower>(new arcaneTower(*ptr));
else
currentTower = std::make_shared<tower>(*jakisTower);
Btw.:
class tower :public sf::Drawable
{
public:
~tower();
tower();
protected:
sf::Sprite image;
sf::Texture texture;
}
Mam nadzieje, że nie ładujesz osobno tekstury dla każdego obiektu?
No i brakuje ci średników po definicji klas.