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?