Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

25.10.2013, 20:21

Templatefunktion in Klasse, no matching function for call to

Hey Leute

Habe eben ein Template erstellt, um dynamisch listen aus einer Klasse zu entnehmen, der Compiler meckert aber, das er die funktion nicht kennt.

Kann man keine Templates in normale Klassen einfügen?(funktionstemplates)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#ifndef WEAPON_HPP
#define WEAPON_HPP
#include"Weapon/DarkPoulder.hpp"
#include"Weapon/PurpleEnergy.hpp"
#include "../LXMRox/Sprite/Includes/Sprite.hpp"Sprite.hpp"
#include<list>
class Weapon{

public:
    Weapon();
    ~Weapon();
    void Shot();
    void InitAllWeapon();
    void Update(float x, float y);
    void Check();
    void Render();
template<typename T>
list<T> *GetShotList()
{

    T m_ShotList;
  
    m_ShotList=m_Poulder; // m_Poulder ist zum test vom festen Typ PurpleE(eine Klasse(Waffe))
return &m_ShotList;
}
    //list<DPoulder> *GetShotList () {return &m_Poulder;}
    //list<PurpleE> *GetShotList1(){return &m_Purple;}

private:
    list<DPoulder> m_Poulder; //Schussliste von DPoulder
    list<PurpleE> m_Purple;   //Schussliste von Purple
    list<CSprite*> m_Weaps;    //Sprites der Waffen
    CSprite *m_wBorder;
    CSprite *m_pExplode;
    bool m_bShotLock;         // Darf der nächste Schuss raus?
    int Weapons;
    int ActivWeapon;
    float m_fXPos;
    float m_fYPos;


};
#endif // WEAPON_HPP




Hier wird die funktion abgefragt:

C-/C++-Quelltext

1
list<DPoulder> *GetShotList () {return m_wWeapon->GetShotList();}//Der Player fragt mit m_wWeapon->GetShotList() die Template funktion ab.


Hoffe ihr könnt mir helfen
Gruß Leri

2

25.10.2013, 21:10

- ist Zeile 5 ein Kopierfehler? So wie die da steht, sollte das niemals kompilieren
- in Zeile 24 gibts du einen Zeiger auf ein lokales Objekt zurück. Der Zeiger wird ungültig sobald die Funktion verlassen wird. Und wieso benutzt du m_ als Präfix, ein lokales Objekt ist kein Klassenmember (ebenso fehlt das Präfix in Zeile 36 und 37, wenn du die schon benutzt um die Übersicht zu steigern, solltest du konsequent sein, da du sonst das Gegenteil erreichst)
- der eigentliche Aufruf (man ruft Funktionen auf und fragt sie nicht ab) sieht aber ok aus, je nachdem, was m_wWeapon für ein Typ ist. Poste mal die genaue Compilermeldung und vielleicht noch etwas Code um den Aufruf herum.
- Ich glaube, du brauchst für dein Problem gar keine Templates, Polymorphie sollte eigentlich reichen (d.h. je nach Typ anders definierte Funktionen).
Lieber dumm fragen, als dumm bleiben!

3

25.10.2013, 21:29

- der eigentliche Aufruf (man ruft Funktionen auf und fragt sie nicht ab) sieht aber ok aus, je nachdem, was m_wWeapon für ein Typ ist. Poste mal die genaue Compilermeldung und vielleicht noch etwas Code um den Aufruf herum.

Nein, SFINAE. Der Compiler kann keinen Typen bestimmen, also gibt es keine Funktion diesen Namens.

- Ich glaube, du brauchst für dein Problem gar keine Templates, Polymorphie sollte eigentlich reichen (d.h. je nach Typ anders definierte Funktionen).

Nein. Der Rückgabewert gehört nicht zur Signatur.
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

4

25.10.2013, 21:38

ja das mit der übersichtlichkeit seh ich ein :) werde ich noch ändern.

Mir gehts ja darum, das ich verschiedene Waffentypen hab, die mit der template funktion GetShotList(); die jeweiligen listen mit unterschiedlichen Schüssen herausgibt.

Die Funktion wird von der Game klasse aus aufgerufen, um kollisionen zu überprüfen zwischen Schüssen und Asteroiden.

Die Game Klasse:
Ausschnitt: Collision()

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
void CGame::CheckCollisions ()
{

  // Schussliste des Spielers holen
  list<DPoulder> *ShotList = m_pPlayer->GetShotList ();

  // Iteratoren für Asteroiden- und Schussliste
  list<CAsteroid>::iterator ItAsteroid = m_AsteroidList.begin ();
  list<DPoulder>::iterator ItShot;

  // Rects für Asteroiden und Schüsse
  SDL_Rect RectAsteroid;
  SDL_Rect RectShot;

  // Alle Asteroiden durchlaufen
  while (ItAsteroid != m_AsteroidList.end () )
  {
    // Rect des Asteroiden holen
    RectAsteroid = ItAsteroid->GetRect ();

    // Alle Schüsse durchlaufen
    for (ItShot = ShotList->begin ();
         ItShot != ShotList->end ();
         ++ItShot)
    {
      // Rect des Schusses holen
      RectShot = ItShot->GetRect ();


      // Überschneiden sich die Rects?
      if (RectShot.y < RectAsteroid.y + RectAsteroid.h &&
          RectShot.y + RectShot.h > RectAsteroid.y &&
          RectShot.x < RectAsteroid.x + RectAsteroid.w &&
          RectShot.x + RectShot.w > RectAsteroid.x)
      {
        // Ja, also gab es eine Kollision. Somit Schuss und
        // Asteroid deaktivieren
        ItAsteroid->SetAlive (false);

        ItShot->SetIsFly();
        ItShot->GetKoordinates(RectAsteroid.x, RectAsteroid.y);

      }

    }

    // Asteroid löschen, falls deaktiviert
    if (ItAsteroid->IsAlive () )
      ItAsteroid++;
    else
      ItAsteroid = m_AsteroidList.erase (ItAsteroid);

  }

} // CheckCollision


ich habe hier einen festen Datentyp gewählt, weil ich diesen auch momentan als test in der Templatefunktion zuweise.


Da ich die Weapon klasse nicht in der Game Klasse included habe, wird über den Player(Spieler Klasse) die liste abgefragt
Ausschnitt Spieler->GetShotList();

C-/C++-Quelltext

1
2
list<DPoulder> *GetShotList () {return m_wWeapon->GetShotList();}
Weapon  *m_wWeapon;


m_wWeapon ist eine Instanz, die alle Waffen(Schüsse mit listen) besitzt.



Die Fehlermeldung

Quellcode

1
2
C:\Dokumente und Einstellungen\Leridan\Desktop\Trigilox\Trigolox\/Player.hpp: In member function 'std::list<DPoulder, std::allocator<DPoulder> >* CPlayer::GetShotList()':
C:\Dokumente und Einstellungen\Leridan\Desktop\Trigilox\Trigolox\/Player.hpp:19: error: no matching function for call to 'Weapon::GetShotList()'

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

25.10.2013, 21:43

Vielleicht sollten die Schüsse auch einfach in der Game Klasse gespeichert werden... ;)

6

25.10.2013, 21:49

Wenn ich in der Spielerinstanz, wie folgt den Code ändere funktioniert alles.

C-/C++-Quelltext

1
list<DPoulder> *GetShotList () {return m_wWeapon->GetShotList<DPoulder>();}



Allerdings, ist das ganze dann nicht dynamisch, und ich kann es nicht wirklich als template verwenden.

Wie könnte ich das ganze denn anstellen, um mit der Kollisionsfunktion in der Game Klasse alle listen durchzulaufen, ohne bei der GetShotList den Typen davor zu schreiben?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

25.10.2013, 21:51

Die Frage ist: Wieso willst du das machen? Wieso genau müssen die Shots in der Weapon gespeichert werden?

8

25.10.2013, 21:52

Wäre eine möglichkeit, aber es wird ja noch mehr Kollisionen geben, zwischen Spieler und Schüssen, Asteroiden u.s.w.

Weiß nicht, ob das so eine gute Idee wäre, das alles in die Game Klasse zu packen ^^

9

25.10.2013, 21:54

Nunja, ich wollte die Schüsse in der Waffen Klasse lassen, weil ich da die abfrage habe, ob geschossen wurde, oder wieviele Waffen es gibt, wieviele Waffen der Spieler besitzt und und und.

Weiß nicht so ganz, wie ich das sauber aufteilen sollte.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

25.10.2013, 21:58

Wieso weiß die Weapon Klasse, wieviele Instanzen es von ihr gibt? Ist das nicht eher etwas, um das sich die Stelle kümmern sollte, die Weapons instanziert!?

Werbeanzeige