Ich hoffe, der Titel beschreibt eigentlich das, was ich ...C++ Methodenaufruf und Typ Bereichsauflösungs Mehrdeutigkeit
fragen wollte, schrieb ich ein Stück Code, der mit gcc kompiliert und arbeitet als ich gedacht. Allerdings kompiliert es nicht mit llvm und der Code wird anders ausgeführt, wenn mit ICC kompiliert! Hier
sind ein Beispiel für das Problem:
#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();
}
gcc Ausgabe: A :: foo()
icc Ausgang: B :: foo()
Könnte jemand erklären, was der Standard sagen hat über dieser Fall?
Ich würde sagen, es ist ein Fehler in GCC und ICC, da 'B :: base' kein _Member_ von' B' ist, was bedeutet, dass es nicht möglich sein sollte, darauf als Member zuzugreifen ('bp-> Basis "). –
Ich stimme @JoachimPileborg zu, außerdem könnte 'base' in diesem Umfang als B interpretiert werden. Haben Sie mit Warning Flags kompiliert? (-Wall for gcc) – Geoffroy
Ist das nicht nur undefiniertes Verhalten, weil 'main' nicht von der benötigten Form ist? Sieht so aus, als hätten alle Compiler Recht. –