3 Stimmen

const TypedeffedIntPointer nicht gleich const int *

Ich habe den folgenden C++-Code:

typedef int* IntPtr;
const int* cip = new int;
const IntPtr ctip4 = cip;

Ich kompiliere dies mit Visual Studio 2008 und erhalte den folgenden Fehler:

Fehler C2440: 'initializing' : kann nicht von 'const int *' nach 'const IntPtr' konvertieren

Offensichtlich ist mein Verständnis von Typedefs nicht das, was es sein sollte.

Der Grund, warum ich frage, ich speichere einen Zeigertyp in einer STL-Map. Ich habe eine Funktion, die eine Konstante Zeiger zurückgibt, die ich verwenden möchte, um in der Karte zu suchen (mit map::find(const key_type&). Da

const MyType* 

et

const map<MyType*, somedata>::key_type

nicht kompatibel ist, habe ich Probleme.

Mit freundlichen Grüßen Dirk

7voto

Luc Touraille Punkte 76149

Wenn Sie schreiben const IntPtr ctip4 deklarieren Sie eine const-Zeiger-zu-int in der Erwägung, dass const int * cip erklärt eine Zeiger-zu-Konst-int . Diese sind nicht dasselbe, daher ist die Umrechnung unmöglich.

Sie müssen die Deklaration/Initialisierung von cip ändern in

int * const cip = new int;

Um dieses Problem in Ihrem Beispiel zu lösen, müssen Sie entweder den Schlüsseltyp der Karte in const MyType * (ob es sinnvoll ist oder nicht, hängt von Ihrer Anwendung ab, aber ich denke, dass das Ändern eines MyType-Objekts über einen Zeiger als Schlüssel in der Map unwahrscheinlich ist), oder greifen Sie auf const_casting des Parameters zu finden:

#include <map>

int main()
{
    const int * cpi = some_func();

    std::map<const int *, int> const_int_ptr_map;
    const_int_ptr_map.find(cpi); //ok

    std::map<int *, int> int_ptr_map;
    int_ptr_map.find(const_cast<int *>(cpi)); //ok
}

5voto

James McNellis Punkte 337231

const IntPtr ist dasselbe wie int* const , nicht const int* .

Das heißt, es ist ein const Zeiger auf eine int und nicht ein Zeiger auf eine const int .

Eine Lösung wäre, zwei Typendefinitionen bereitzustellen:

typedef int* IntPtr;
typedef const int* ConstIntPtr;

und verwenden ConstIntPtr wenn Sie einen Zeiger auf eine const int .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X