2016-05-25 20 views
11

Trong mã mẫu này, có hai câu hiển thị cùng một biến tĩnh. Cái đầu tiên không có sự mơ hồ, nhưng cái thứ hai có, tại sao?Sự mơ hồ trong biến thành viên tĩnh đủ điều kiện

#include <iostream> 

using namespace std; 

struct A { static const char a = 'a'; }; 
struct B : public A { }; 
struct C : public A { }; 
struct G : public B, public C { }; 

int main() 
{ 
    G v; 

    cout << G::B::A::a << endl; 
    cout << v.B::A::a << endl; 
} 

lỗi GCC (theo một số ý kiến, không có sự nhập nhằng trong kêu vang):

main.cpp:15:18: error: 'A' is an ambiguous base of 'G' 
    cout << v.B::A::a << endl; 

Code on coliru

+1

Tôi biết tôi đã nhìn thấy một cái gì đó như thế này một tháng hoặc lâu hơn trước đây. Tôi tin rằng nó không biết cha mẹ để sử dụng trong trường hợp 'v'. Đang cố gắng tìm nó. – NathanOliver

+0

@barakmanos Chính xác, tôi đang nghiên cứu trường hợp khi tôi không cần thừa kế ảo. –

+1

Điều này biên dịch thành công với tiếng kêu. – interjay

Trả lời

5

Đây rõ ràng là một lỗi trong GCC, như một GCC maintainer khuyên bạn báo cáo. Tuy nhiên, cho đến khi nó cố định, bạn có thể sử dụng một cách giải quyết khó chịu như thế này:

std::cout << static_cast<B &>(v).A::a; 

Ưu điểm là điều này sẽ giúp disambiguate nếu trong một (phức tạp) kịch bản đó có các biến có cùng tên trong một trong các lớp cơ sở .

Các vấn đề liên quan