template class błąd z konstruktorem

0

Witam, mam problem z moim kodem:

// Wycięty do najważniejszych części 
template<typename T>
// shape.hpp:
class shape
{
public:

  shape(const sf::ConvexShape&;
  shape(const sf::RectangleShape&);
  shape(const sf::CircleShape&);
 ~shape() = default;

private:
  T       visual;
};
// shape.cpp:

 template<typename T>
 shape<T>::shape(const sf::CircleShape& shape)
 {

    visual = shape;
 // (...)
 }
 template<typename T>
 shape<T>::shape(const sf::ConvexShape& shape)
 {
  visual = shape;
// (...)

 }
 template<typename T>
 shape<T>::shape(const sf::RectangleShape& shape)
 {
      visual = shape;
  // (...)

 }
// main.cpp
int main()
{
sf::CircleShape circ;
shape<sf::CircleShape> circle(circ);

sf::RectangleShape ground;
shape<sf::RectangleShape> rect(ground);
}
undefined reference to `shape<sf::CircleShape>::shape(sf::CircleShape const&)'|
undefined reference to `shape<sf::RectangleShape>::shape(sf::RectangleShape const&)'|

Przeczytałem w internecie, ze rozwiązaniem może być dodanie do shape.cpp template class shape<sf::CircleShape>;
I co prawda, zadziałało. Niestety tylko z jednym typem, tzn. działa albo z sf::CircleShape albo z sf::CircleRectangle
Gdy próbuje dodaj jeszcze jedną linikje a wiec

// main.cpp
template class shape<sf::CircleShape>;
template class shape<sf::RectangleShape>;

Otrzymuje strasznie bezsensowny błąd:

 no match for 'operator=' in '((shape<sf::RectangleShape>*)this)->shape<sf::RectangleShape>::visual = shape'|
 candidate is:
 sf::RectangleShape& sf::RectangleShape::operator=(const sf::RectangleShape&)|
  no known conversion for argument 1 from 'const sf::CircleShape' to 'const sf::RectangleShape&'|

Przeczytałem ze rozwiązaniem mogło by być wrzucenie wszystkiego z .cpp do .hpp ale nie za bardzo podoba mi się to rozwiązanie. Gdzie jest problem?

0

WTF?

template<typename T> class shape
  {
   private:
   T visual;
   public:
   shape(const T visual&):visual(visual) {}
  };

i już.

0

_13th_Dragon Kod jest wyciety. Kazdy konstruktor robi dużo róznych rzeczy nie związanych z innymi.

2

Przeczytałem ze rozwiązaniem mogło by być wrzucenie wszystkiego z .cpp do .hpp ale nie za bardzo podoba mi się to rozwiązanie. Gdzie jest problem?

Problem jest w tym, że szablony powinny być w całości w plikach nagłówkowych (jedynie pełne specjalizacje metod/funkcji mogą być w plikach źródłowych).

0

tak jak @_0x666_ pisze, wszystko musi byc w jednym pliku. Jest maly trik do tego

Na samym koncu pliku hpp zrob cos takiego

#include <template.cpp> (w nawiasach nazwa twojego pliku i rozszerzenie cpp). Dzieki temu kompilator przed linkowaniem/kompilowaniem wrzuci caly kod do H ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1