"Ungültige Umwandlung von »GLvoid**« in »const GLvoid**«". Warum?
-
Ich will die OpenGL-Routine glMultiDrawElements aufrufen, die folgende Signatur hat:
void glMultiDrawElements(GLenum, const GLsizei*, GLenum, const GLvoid**, GLsizei)Als 4. Parameter verwende ich dabei eine Variable vom Typ GLuint**, was zu folgendem Kompilierfehler führt:
Fehler: ungültige Umwandlung von »GLuint**« in »const GLvoid**«
Fehler: Argument 4 von »void glMultiDrawElements(GLenum, const GLsizei*, GLenum, const GLvoid**, GLsizei)« wird initialisiertWandle ich die Variable per reinterpret_cast in den Typ GLvoid**, so kommt immer noch die Meldung:
Fehler: ungültige Umwandlung von »GLvoid**« in »const GLvoid**«
Fehler: Argument 4 von »void glMultiDrawElements(GLenum, const GLsizei*, GLenum, const GLvoid**, GLsizei)« wird initialisiertErst wenn ich darum noch einen const_cast setze, lässt es sich kompilieren.
Warum ist das so? Ich dachte bisher, ein const_casts wird gebraucht, wenn man die Konstantheit wegkriegen will; eine Variable als konstanten Parameter einer Funktion zu übergeben geht doch normalerweise aber implizit?
Ich verwende GCC 4.3.0 und hoffe, jemand erleuchtet mich bei dieser Frage!
Danke schon mal!
-
A single const_cast expression may add or remove any number of const or volatile modifiers.
-
Äh danke, aber das ist keine Antwort auf meine Frage. Ich hab ja bereits geschrieben, dass es mit dem const_cast vom Compiler angenommen wird, und dass man die Konstantheit dazucasten kann, ist ja auch klar. Aber ich will ja wissen, warum ich es muss, normalerweise passiert das ja implizit!
-
Hallo,
ein GLVoid** könnte implizit in einen GLVoid** const umgewandelt werden, nicht aber in einen GLVoid const **.
-
Danke,
hast Du auch eine Erklärung (gerne auch verlinkt), warum das so ist?
-
C++ Standard, 4.4 (Qualification conversions), Punkt 4.
Folgendes Beispiel aus dem Standard:
if a program could assign a pointer of type T** to a pointer of type const T** (that is, if line //1 below was allowed), a program could inadvertently modify a const object (as it is done for line //2). For example,
int main() { const char c = 'c'; char* pc; const char** pcc = &pc; //1: not allowed *pcc = &c; *pc = 'C'; //2: modifies a const object }
-
Stimmt, das leuchtet ein, dankeschön!
Die Frage ist beantwortet.