El siguiente código no compila en gcc:C++ y se inyecta nombre base
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();
}
};
};
Y da:
gccbug.cpp: In constructor ‘Two::B::B()’:
gccbug.cpp:23: error: ‘class One::A’ has no member named ‘what’
Ahora, me dijeron que este es el comportamiento correcto (debido a la base inyectada nombre de One :: A haciendo A referirse a One :: A). Sin embargo, este código se compila en C# (bueno, después de cambiar algunas cosas), por lo que parece ser específico de C++.
Lo que me pregunto es ... ¿por qué? ¿Existe un propósito específico para inyectar el nombre base "One :: A" como "A"?
Solo como referencia, C#! = C++. No estoy seguro de por qué está comparando los dos –
No puedo asegurarlo (no tengo mi copia en este momento), pero aparte, preguntas sobre por qué el lenguaje C++ se diseñó de la manera en que A menudo se responde en un libro llamado "El diseño y la evolución de C++" de Stroustrup. –
@TonyTheLion, Bueno, es el otro lenguaje de programación tipo c que tiene "espacio de nombre", y al que tuve acceso a un compilador. No estoy diciendo que solo haya "One True Way" en el que esto sea correcto, pero esto no pareció intuitivo, al menos dado este ejemplo. – kamziro