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

the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

1

23.02.2009, 03:17

[Erledigt] Keinen Reim auf Fehlermeldung

Auf diese Fehlermeldung kann ich mir einfach keinen Reim machen:

Zitat

error C2664: 'std::queue<_Ty>::push': Konvertierung des Parameters 1 von 'Message<MTE> *const ' in 'Message<MTE> *const &' nicht möglich


Seit wann ist es nicht möglich, einen konstanen Pointer auf x in eine Referenz auf einen konstanten Pointer auf x umzuwandeln?
Oder kann ich nicht lesen? ^^

Die Queue ist übrigens wie folgt definiert:

C-/C++-Quelltext

1
std::queue<Message<MTT>*> m_qMessages;
<< an dieser Stelle ist eine Signatur verstorben >>

Asmodiel

Treue Seele

Beiträge: 150

Wohnort: Schweiz

Beruf: Applikationsentwickler

  • Private Nachricht senden

2

23.02.2009, 09:06

Pointer können böse sein,
Wieso packst Du sie in die Queue hinein?
Ich wüsst nicht, was das bringen soll,
und eigentlich find' ich's nicht so toll.
Ansonsten muss mehr Code daher,
vielleicht entdeck' ich dann noch mehr.
Die Befüllungs-Zeilen wären nicht schlecht,
die wär'n zum anschauen gerade recht.

Ich weiss, Du hast grad nichts zu Lachen,
aber den Reim darauf kann ich Dir machen. ;)
Eat a beaver - Save a tree.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

3

23.02.2009, 09:15

Pointer sind nicht böse. Den Eindruck scheinen nur manche zu haben, weil sie nicht richtig mit Pointern umgehen können. Und warum sollte es keinen Sinn machen Zeiger in eine Queue zu packen? Das kann sogar sehr sinnvoll sein.

@Post:
Zeig mal die Zeile wo du den Zeiger in die Queue einfügst.

Asmodiel

Treue Seele

Beiträge: 150

Wohnort: Schweiz

Beruf: Applikationsentwickler

  • Private Nachricht senden

4

23.02.2009, 09:23

Zitat von »"David_pb"«

Pointer sind nicht böse. Den Eindruck scheinen nur manche zu haben, weil sie nicht richtig mit Pointern umgehen können. Und warum sollte es keinen Sinn machen Zeiger in eine Queue zu packen? Das kann sogar sehr sinnvoll sein.


Pscht, das war nur ein Lückenfüller. ;)
Aber hey, kommt drauf an. Eigentlich kann man Pointer in den
meisten Fällen durch Referenzen ersetzen, was ich selbst auch
tue, wenn es geht. Pointer selbst sind nicht böse, aber wenn
man sie nicht sicher behandelt, ist das böse. ;)
Eat a beaver - Save a tree.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

23.02.2009, 09:33

Ja, wenn Referenzen für Zeiger ein sinnvollen Ersatz darstellen hast du recht. :) Aber hier bricht man sich mit dem Versuch eher ein Bein.
Was möglich wäre, wären Smartpointer (oder sonstiges) aber das ist oft auch nicht wirklich notwendig.

6

23.02.2009, 19:59

Zitat von »"the[V«

oid"]Die Queue ist übrigens wie folgt definiert:
Kannst du vielleicht noch den Kontext der Konvertierung zeigen? So, dass man die Deklaration des Zieltyps auch sieht.

Zitat von »"Asmodiel"«

Aber hey, kommt drauf an. Eigentlich kann man Pointer in den
meisten Fällen durch Referenzen ersetzen, was ich selbst auch
tue, wenn es geht.
"Meisten" würde ich jetzt nicht unbedingt sagen, es gibt immer noch viele Fälle, wo Zeiger nötig sind. Das Beispiel hier zeigt das schön, man kann nämlich keine Referenzen in Containern speichern.

Zitat von »"Asmodiel"«

Pointer selbst sind nicht böse, aber wenn
man sie nicht sicher behandelt, ist das böse. ;)
Und sag mir, für welches Sprachmittel das nicht gilt. :p

the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

7

24.02.2009, 20:00

Zitat von »"David_pb"«

Zeig mal die Zeile wo du den Zeiger in die Queue einfügst.


Im Grunde ist es ganz simpel:

C-/C++-Quelltext

1
2
Message<MTE>* const pMessage = pFactory -> create ();
m_qMessages.push (pMessage);


Bei der Push-Zeile kommt die erwähnte Fehlermeldung.
<< an dieser Stelle ist eine Signatur verstorben >>

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

24.02.2009, 20:08

Hm, sieht ok aus. Vllt liegts am Klassentemplate?!

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

9

24.02.2009, 20:21

Nimm doch mal testweise die const raus. Weil irgendwie vermute ich, dass es damit zusammenhängt (Kannst ja sicher create() so umbiegen, dass du ohne const zurückgibst).
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

10

24.02.2009, 20:27

Das const bezieht sich ja auf den Pointer. Die std-Queue nimmt wohl immer konstante Elemente auf, denn wie bereits im ersten Post gezeigt, hab ich das const in der Definition der Queue garnicht drin. Entsprechend macht es auch keinen Unterschied, ob ich das const in Zeile 1 entferne oder nicht (zur Sicherheit aber auch ausprobiert).

Dass es am Klassentemplate liegen könnte, kann ich mir ehrlich gesagt nicht vorstellen, aber ich kann sie ja mal posten:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template <typename MTE>
class Message
{
public:
    // Message takes ownership of given memory block

    Message (const MTE type, void* pvData, const unsigned short nLength)
        : m_type (type), m_pvData (pvData), m_nLength (nLength) { }
    ~Message () { delete [] pvData; }

private:
    MTE m_type;
    void* m_pvData;
    unsigned short m_nLength;

public:
    MTE getType () const { return m_type; }
    const void* getData () const { return m_pData; }
    unsigned short getLength () const { return m_nLength; }
<< an dieser Stelle ist eine Signatur verstorben >>

Werbeanzeige