Spero che il titolo descrive in realtà quello che volevo chiedere ...C++ chiamata di metodo e di risoluzione della visibilità tipo ambiguità
Ho scritto un pezzo di codice che compila con gcc e lavora come volevo. Tuttavia, non viene compilato con llvm e il codice viene eseguito diversamente quando è compilato con icc!
Ecco un esempio 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();
}
uscita gcc: A :: foo()
ICC uscita: B :: foo()
qualcuno potrebbe spiegare che cosa fa lo standard dicono di questo caso?
Direi che è un bug in GCC e ICC, poiché 'B :: base' non è un _member_ di' B', il che significa che non dovrebbe essere possibile accedervi come membro ('bp-> base'). –
Sono d'accordo con @JoachimPileborg, inoltre 'base' potrebbe essere interpretato come B in questo ambito. Hai compilato con le bandierine di Warnings? (-Wall per gcc) – Geoffroy
Non è solo un comportamento indefinito, perché 'main' non è della forma richiesta? Sembra che tutti i compilatori abbiano ragione. –