template<typename T> void F(T)
{
class A
{
void f() { new A; } // 'A' - declaration without typevoid g() { A* a; } // 'A' - pointer to this function type is not supported yet
};
};
voidOnStart()
{
F(0);
}
class A
{
};
class B : protected A
{
};
voidOnStart()
{
A* a;
B* b= (B*)a; // conversion from 'B *' to 'A *' is not accessible because of inheritance access
}
aunque aquí la conversión es explícita. Todo funciona en C++.
C++ convierte este código en reinterpret_cast y MQL en dynamic_cast. Y por lo que tengo entendido, este es exactamente el caso cuando el compilador puede encontrar un error de dynamiccast durante la compilación.
reinterpret_cast es ilegítimo en este caso, por lo que el hecho de que este código compile en C++ no es un argumento.
C++ convierte este código en reinterpret_cast y MQL en dynamic_cast. Y por lo que tengo entendido, este es exactamente el caso cuando el compilador puede encontrar un error de dynamiccast durante la compilación.
Reinterpret_cast es ilegítimo en este caso, por lo que el hecho de que este código compile en C++ no es un argumento.
Espera, ¿por qué mezclas las cosas? ¿Qué tiene que ver el reparto dinámico? Las tareas del compilador no incluyen hacer de Sherlock Holmes y buscar algo en la lógica del programa. Sólo realiza una comprobación formal del cumplimiento de la norma del lenguaje, nada más. Y todo es correcto desde el punto de vista de la norma.
Si hubieras mirado bien mi ejemplo, habrías visto que el problema estaba relacionado con protected. Si lo cambias a public, todo está bien. El objeto en sí no se modifica por esto, es decir, el compilador MQL sólo tiene una restricción innecesaria, eso es todo.
Así que no especules y busques un significado secreto donde no lo hay, que no es más que un error trivial del compilador.
Error de compilación:
Aquí hay un par de errores más:
Y también hay algo que falla en la conversión del puntero.
El siguiente código no compila:
aunque aquí la conversión es explícita. Todo funciona en C++.
Y también hay algo de desorden en la introducción de los carteles.
Es cierto, el compilador está luchando.
Ve a leer sobre dynamic_cast, static_cast y reinterpret_cast y cuándo usarlos correctamente y cuándo no.
C++ convierte este código en reinterpret_cast y MQL en dynamic_cast. Y por lo que tengo entendido, este es exactamente el caso cuando el compilador puede encontrar un error de dynamiccast durante la compilación.
reinterpret_cast es ilegítimo en este caso, por lo que el hecho de que este código compile en C++ no es un argumento.
C++ convierte este código en reinterpret_cast y MQL en dynamic_cast. Y por lo que tengo entendido, este es exactamente el caso cuando el compilador puede encontrar un error de dynamiccast durante la compilación.
Reinterpret_cast es ilegítimo en este caso, por lo que el hecho de que este código compile en C++ no es un argumento.
Espera, ¿por qué mezclas las cosas? ¿Qué tiene que ver el reparto dinámico? Las tareas del compilador no incluyen hacer de Sherlock Holmes y buscar algo en la lógica del programa. Sólo realiza una comprobación formal del cumplimiento de la norma del lenguaje, nada más. Y todo es correcto desde el punto de vista de la norma.
Si hubieras mirado bien mi ejemplo, habrías visto que el problema estaba relacionado con protected. Si lo cambias a public, todo está bien. El objeto en sí no se modifica por esto, es decir, el compilador MQL sólo tiene una restricción innecesaria, eso es todo.
Así que no especules y busques un significado secreto donde no lo hay, que no es más que un error trivial del compilador.