Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

problem z szablonami SFML

Ostatnio zmodyfikowano 2019-12-22 14:07
Autor Wiadomość
Xgrod
Temat założony przez niniejszego użytkownika
problem z szablonami SFML
» 2019-12-21 00:26:52
Plik .h
C/C++
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
C/C++
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.
P-175838
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.
P-175843
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.
P-175845
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).
C/C++
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.
P-175846
Xgrod
Temat założony przez niniejszego użytkownika
» 2019-12-22 12:36:58
Wstawię uprostrzoną wersję problemu
plik.hpp
C/C++
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
C/C++
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&
C/C++
tew( T & a ) // przecież jest referencja
    : Texture() // tu też tew2( T & b )
    : tew( b )
{ }
P-175847
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&)
P-175848
Xgrod
Temat założony przez niniejszego użytkownika
» 2019-12-22 14:07:01
Dzięki widzę błąd. Koniec tematu
P-175849
« 1 »
  Strona 1 z 1