Следующий код не компилируется в GCC:C++ и впрыскивается базовое имя
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();
}
};
};
И это дает:
gccbug.cpp: In constructor ‘Two::B::B()’:
gccbug.cpp:23: error: ‘class One::A’ has no member named ‘what’
Теперь, мне сказали, что это правильное поведение (из-за введенного основания имя One :: A делает A ссылкой на One :: A). Однако этот код компилируется в C# (ну, после изменения нескольких вещей), поэтому это похоже на C++.
Что мне интересно, почему? Существует ли конкретная цель для инъекции базового имени «One :: A» как «A»?
Только для справки, C#! = C++. Я не уверен, почему вы сравниваете два –
. Я не могу сказать точно (у меня нет моей копии со мной прямо сейчас), но в стороне, вопросы о том, почему язык C++ был разработан так, как он были часто отвечены в книге под названием «Дизайн и эволюция C++» от Stroustrup. –
@TonyTheLion, ну, это другой c-подобный язык программирования, который имеет «пространство имен», и тот, к которому я имел доступ к компилятору. Я не говорю, что есть только «Один истинный путь», в котором это правильно, но это не показалось интуитивным, по крайней мере, с учетом этого примера. – kamziro