Poniższy kod nie kompilacji w gcc:C++ i wstrzykuje nazwa bazowa
namespace One{
class A{
};
};
namespace Two{
class A{
public:
void what(){
cout << "Two::A says what!" << endl;
}
};
class B : public One::A{
public:
B(){
A xx;
xx.what();
}
};
};
I daje:
gccbug.cpp: In constructor ‘Two::B::B()’:
gccbug.cpp:23: error: ‘class One::A’ has no member named ‘what’
Teraz, powiedziano mi, że jest to poprawne zachowanie (na skutek wtryskiwanego podstawy imię One :: A w odniesieniu do One :: A). Jednak ten kod kompiluje się w języku C# (no, po zmianie kilku rzeczy), więc wydaje się, że jest to C++.
Zastanawiam się, dlaczego ... dlaczego? Czy istnieje konkretny cel wstrzykiwania nazwy bazowej "One :: A" jako "A"?
Dla odniesienia, C#! = C++. Nie jestem pewien, dlaczego porównujesz te dwa numery: –
Nie mogę powiedzieć na pewno (nie mam teraz mojego egzemplarza ze mną), ale na bok, pytania o to, dlaczego język C++ został zaprojektowany w taki sposób, często odpowiadano w książce "Projekt i ewolucja C++" autorstwa Stroustrupa. –
@TonyTheLion, No cóż, jest to inny język programowania w stylu c, który ma "przestrzeń nazw" i taki, do którego miałem dostęp do kompilatora. Nie mówię, że jest tylko "Jedna Prawdziwa Droga", w której to jest poprawne, ale to nie wydawało się intuicyjne, przynajmniej podane w tym przykładzie. – kamziro