template class błąd z konstruktorem

template class błąd z konstruktorem
  • Rejestracja: dni
  • Ostatnio: dni
0

Witam, mam problem z moim kodem:

Kopiuj
// 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);
}
Kopiuj
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

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

Otrzymuje strasznie bezsensowny błąd:

Kopiuj
 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?

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0

WTF?

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

i już.

  • Rejestracja: dni
  • Ostatnio: dni
0

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

06
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2440
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).

fasadin
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4883
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 ;)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.