Xgrod Temat założony przez niniejszego użytkownika |
problem z szablonami SFML » 2019-12-21 00:26:52 Plik .h class tew2; class tew; class wet5
: public Image { public: wet5() : Image() { } }; class tew : public Texture { public: template < class T > void zaladuj( T & a ) { this->loadFromImage( a ); } tew() : Texture() { } }; class tew2 : public tew { public: template < class T, class co_T = allocator < T >> tew2( T & a ) : tew() { this->zaladuj( a ); } }; w main vector < wet5 > w; vector < tew2 > s; w.push_back( wet5() ); w.back().create( 40, 40 ); s.push_back( tew2( w.back() ) ); błąd jaki wywala no matching function for call to 'tew::loadFromImage(tew2&) Dlaczego nie mogę wywołać funkcji zaladuj ? Próbowałem najpierw aby kod funkcji był w konstruktorze klasy tew,ale ten sam błąd. |
|
DejaVu |
» 2019-12-21 23:28:46 Niestety Twój kod jest na tyle bezsensowny (włącznie z nazwami klas), że chyba powinieneś przemyśleć koncepcję projektu.
Proponuję Ci, abyś zamiast dziedziczenia używał klas SFML-a jako pola w Twoich klasach. Kod będzie wówczas dużo prostszy, łatwiejszy w utrzymaniu i ... nie będzie trzeba zastanawiać się co w ogóle miałeś na myśli. |
|
Xgrod Temat założony przez niniejszego użytkownika |
» 2019-12-22 10:33:42 Kod jak i nazwy zostały wymyślone tylko na potrzebę błędu na który się napotkałem. Nigdy nie miałem pomysłów na super nazwy klas. A ten kod, (cały projekt) istnieje tylko w ramach sprawdzania błędów oraz szukania rozwiązania. Nie ma on większego sensu. Jedyny problem jest jak podam przez konstruktor (z szablonem) objekt klasy, wywoła się wcześniejszy konstruktor z szablonem do którego zostanie przesłany obiekt i tam funkcja loadfromImage nie działa, chociaż przesłany obiekt dziedziczy po Image. Mogłem źle napisać szablon pierwszego konstruktora ale próbowałem różnych zmian i wywalało ten sam błąd. |
|
DejaVu |
» 2019-12-22 10:52:54 To wklej pełną treść błędu z zakładki Output. W każdym razie błąd sugeruje niezgodność typów (tj. niezgodność przekazywanego typu poprzez parametr). bool sf::Texture::loadFromImage( const Image & image, const IntRect & area = IntRect() ) Możliwe, że brakuje Ci constów. Tym bardziej, że w wywołaniu nie przekazujesz referencji na obiekt, tylko tworzysz tymczasowy obiekt. |
|
Xgrod Temat założony przez niniejszego użytkownika |
» 2019-12-22 12:36:58 Wstawię uprostrzoną wersję problemu plik.hpp class wet5 : public Image { public: wet5() : Image() { } }; class tew : public Texture { public: template < typename T > tew( T & a ) : Texture() { this->loadFromImage( a ); } }; class tew2 : public tew { public: template < typename T > tew2( T & b ) : tew( b ) { } }; main.cpp vector < wet5 > w; vector < tew2 > s; w.push_back( wet5() ); w.back().create( 40, 40 ); s.push_back( tew2( w.back() ) ); Błędy wywala te same C:\Users\Radomir\Desktop\wszystkie projekty code blocks\projekt testowy 2\test.hpp|62|error: no matching function for call to 'tew::loadFromImage(tew2&) D:\SFML-2.5.1\include\SFML\Graphics\Texture.hpp|215|note: candidate: bool sf::Texture::loadFromImage(const sf::Image&, const IntRect&) D:\SFML-2.5.1\include\SFML\Graphics\Texture.hpp|215|note: no known conversion for argument 1 from 'tew2' to 'const sf::Image& tew( T & a ) : Texture() tew2( T & b ) : tew( b ) { }
|
|
pekfos |
» 2019-12-22 13:43:42 Nie masz konstruktora kopiującego, więc wrzucanie obiektu tew2 do wektora próbuje wykonać kopię obiektu tym szablonowym konstruktorem, który nie ma sensu dla klas nie dziedziczących po sf::Image. W tym wypadku to nigdy nie powinien był być szablon, tylko jedna wersja przyjmująca referencję na const sf::Image. Gdyby nie twoje bezsensowne nazwy, sam byś pewnie zauważył, ze ładowanie jest wywoływane z tew2, nie wet5. błąd jaki wywala no matching function for call to 'tew::loadFromImage(tew2&)
|
|
|
Xgrod Temat założony przez niniejszego użytkownika |
» 2019-12-22 14:07:01 Dzięki widzę błąd. Koniec tematu |
|
« 1 » |