Các mã sau đây không biên dịch trong gcc:C++ và tiêm tên cơ sở
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();
}
};
};
Và nó mang lại:
gccbug.cpp: In constructor ‘Two::B::B()’:
gccbug.cpp:23: error: ‘class One::A’ has no member named ‘what’
Bây giờ, tôi đã nói rằng đây là hành vi đúng (do cơ sở tiêm name of One :: A make A tham chiếu đến One :: A). Tuy nhiên, mã này biên dịch trong C# (tốt, sau khi thay đổi một vài điều), do đó, điều này có vẻ là c + + cụ thể.
Điều tôi đang thắc mắc là .. tại sao? Có mục đích cụ thể nào để tiêm tên cơ sở "One :: A" là "A"?
Chỉ để tham khảo, C#! = C++. Tôi không chắc chắn tại sao bạn so sánh hai số –
Tôi không thể nói chắc chắn (hiện tại tôi không có bản sao của mình), nhưng ngoài ra, các câu hỏi về lý do tại sao ngôn ngữ C++ được thiết kế theo cách thường được trả lời trong một cuốn sách có tên "Thiết kế và tiến hóa của C++" của Stroustrup. –
@TonyTheLion, Vâng, đó là ngôn ngữ lập trình giống c khác có "không gian tên" và một trình duyệt mà tôi có quyền truy cập vào trình biên dịch. Tôi không nói rằng chỉ có "Một cách thực sự" trong đó điều này là chính xác, nhưng điều này dường như không trực quan, ít nhất là đưa ra ví dụ này. – kamziro