Frage

Ich habe einen Umwandlungsoperator bekam, die einen const Zeiger zurückgibt, und ich muss es const_cast. Doch das nicht funktioniert, zumindest unter MSVC8. Der folgende Code reproduziert mein Problem:

class MyClass {
public:
    operator const int* () {
        return 0;
    }
};

int main() {
    MyClass obj;
    int* myPtr;
    // compiles
    const int* myConstPtr = obj;
    // compiles
    myPtr = const_cast<int*>(myConstPtr);
    // doesn't compile (C2440: 'const_cast' : cannot convert from 'MyClass' to 'int *')
    myPtr = const_cast<int*>(obj);
}

Warum ist das so? Es erscheint unlogisch. Dank!

War es hilfreich?

Lösung

Um es Ihnen zu tun haben, funktioniert:

myPtr = const_cast<int*>(static_cast<const int*>(obj));

Wenn Sie direkt const_cast, der Compiler Look für den Cast-Operator in int *.

Andere Tipps

const_cast kann nur die Konstantheit eines Typs ändern. Wenn Sie den impliziten Operator anrufen wollen, müssen Sie Sie eine static_cast brauchen, und dann ein const_cast. Während es ärgerlich macht es sicher, dass Sie explizit in dem, was Sie tun.

myPtr = const_cast<int*>(static_cast<const int*>(obj));

Sie können auch die alte Schule c-Casts Operator

myPtr = (int*)(const int*)obj;

Das ist aber sehr aus mehreren Gründen abgeraten:

  • Es ist nicht grepable
  • Sie können ganz einfach mehr tun, als Sie gedacht. Die meiste Zeit Sie wollen nicht zu verwirren mit const_cast Typ Operationen und static_cast mit erzwingt dies. In der Tat wollen Sie nur sehr selten eine const_cast. Wenn Sie sich es regelmäßig zu tun haben Sie einige Design-Fehler.

Edit: Ich war etwas weg, ich regelte es jetzt. Es macht den c-Stil ein wenig hässlichen werfen

Sie können nur const_cast verwenden, um einen nicht konstanten Zeiger des gleichen Typs zu konvertieren (wegzuwerfen Konstantheit). Werfen zwischen nicht verwandten Arten Sie reinterpret_cast benötigen.

Denken Sie an const_cast<> als Funktion template

template <typename Target, typename Source>
Target const_cast( Source src );

(das ist nicht, wie es umgesetzt, aber es hilft hier vorstellen, es war). Dann Source als MyClass abgeleitet, und es gibt nichts const_cast tun kann, einen int zu erhalten * von einem MyClass.

Was Sie wollen, ist eine der folgenden:

const_cast<int*>( static_cast<const int*>(obj) /* invokes operator const int* */ );
// or
const_cast<int*>( obj.operator const int*() );

Wahrscheinlich wäre es klarer zu Ihrem Compiler, wenn Sie etwas tun, wie:

myPtr = const_cast<int*>(obj());

Ich habe noch nicht versucht, gedacht werden.

EDIT: Sollte die Bediener Erklärung nicht so etwas wie:

const int* operator () {
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top