2012-08-17 30 views
10

Tôi có một trường hợp kỳ lạ với Visual Studio 2003. Vì lý do nào chính đáng, tôi có hệ thống phân cấp như sau:Sai tên độ phân giải khi phụ huynh và lớp bên trong có cùng tên

class A {}; 

class B : public A { 
public: 
    class A {}; 
}; 

class C : public B::A {}; 

Đó là, tôi có một nội lớp có cùng tên với cha mẹ của lớp bên ngoài. Khi C cố gắng kế thừa từ B::A, Visual Studio nghĩ rằng tôi đang trỏ đến lớp cha A, không phải lớp lồng nhau trong phạm vi B. GCC dường như giải quyết cho phiên bản lớp bên trong như tôi mong đợi

Đây có phải là lỗi của Visual Studio 2003 hay tôi đang làm sai? Có cách giải quyết khác (ngoài nâng cấp Visual Studio) không?

+0

Visual C++ 2003 được phát hành cách đây chín năm. Nó sẽ được khuyến khích để nâng cấp cho rất nhiều lý do. –

+1

@JamesMcNellis Nếu tôi chịu trách nhiệm về những điều này, chúng tôi đã nâng cấp từ lâu rồi, nhưng thật đáng tiếc tôi không phải là –

Trả lời

2

Có, lỗi này trông giống như lỗi VS2003. Cách giải quyết đơn giản - sử dụng typedef, hoạt động theo cách này:

class A { public: int x; }; 
class B : public A { public: class A { public: int y; }; }; 

typedef B::A BA; 

class C: public BA {}; 

void f() 
{ 
    C cc; 
    cc.y = 0; 
} 
5

Điều này trông giống như một lỗi trong Visual C++ 2003. Sử dụng Visual C++ 2012, B::A chính xác tên lớp lồng nhau A, không phải lớp cơ sở A.

+0

Vì một giải pháp thay thế, tôi không biết: thiết kế này khá đáng ngờ. Tôi sẽ đổi tên lớp lồng nhau. Nếu tôi đã có Visual C++ 2003 cài đặt tôi muốn cố gắng để xem những gì lên, nhưng tôi đã không được sử dụng Visual C++ 2003 trong một vài năm. –

+0

Tôi ngu ngốc và không thử nghiệm ví dụ đơn giản của mình; hóa ra là sai. Bản cập nhật tái tạo sự cố –

+2

@MichaelMrozek VS 2012 giải quyết cho lớp học bên trong. – ForEveR

0

Dường như lỗi VS,
Tôi không biết Cảm ơn bạn đã đăng.
Tôi nghĩ rằng Giải pháp thay thế sẽ là Mẫu SafeInherit Tôi không biết tên nào sẽ là tên tốt hơn.

template <typename T> 
struct SafeInherit{ 
    typedef T Type; 
}; 

class B : public SafeInherit<A>::Type { 
    public: 
    class A {}; 
} 
Các vấn đề liên quan