espero que el título describe realmente lo que quería preguntar ...C++ llamada al método de resolución de alcance y tipo de ambigüedad
yo escribimos un trozo de código que compila con gcc y trabaja como era mi intención. Sin embargo, no se compila con llvm y el código se ejecuta de manera diferente cuando se compila con icc!
Aquí se muestra un ejemplo del problema:
#include <iostream>
using std::cout; using std::endl;
class A {
public:
virtual void foo() { cout << "A::foo()" << endl; }
};
class B : public A {
public:
typedef A base;
virtual void foo() { cout << "B::foo()" << endl; }
};
int main() {
typedef B base;
base* bp = new B();
bp->base::foo();
}
salida de gcc: A :: foo()
ICC de salida: B :: foo()
Podría explicar a alguien lo que hace la norma dicen acerca ¿este caso?
Diría que es un error en GCC e ICC, ya que 'B :: base' no es un _miembro de' B', lo que significa que no debería ser posible acceder a él como miembro ('bp-> base'). –
Estoy de acuerdo con @JoachimPileborg, además 'base' podría interpretarse como B en este ámbito. ¿Has compilado con banderas de Advertencias? (-Wall for gcc) – Geoffroy
¿No es solo un comportamiento indefinido, porque 'main' no tiene la forma requerida? Parece que todos los compiladores tienen razón. –