tôi làm lớp này đơn giản, mà vẫn được chơi với tâm trí tôi:Tiếp cận lớp lồng nhau tin
class A {
private:
class B {};
public:
B getB() {
return B();
};
};
Tính đến C++ 03, lớp này biên dịch tốt, nhưng có chỉ là không đẹp tìm cách để gán kết quả của getB()
cho một giá trị, theo nghĩa là:
A::B b = A().getB();
Không biên dịch.
tôi đã nhận nó bằng cách sử dụng một mẫu trung gian, theo cách này:
template <typename T>
struct HideType {
typedef T type;
};
HideType<A::B>::type b = A().getB();
Nhưng điều này có vẻ chỉ là khủng khiếp, cho nhiệm vụ này đơn giản nhận được một biến vế trái A :: B.
Điều này không còn đúng nữa kể từ C++ 11 hoặc ít nhất là không phải với gcc. Mã này vẫn là không hợp lệ:
A::B b = A().getB();
Nhưng đây là hợp lệ:
auto b = A().getB();
Có một lỗ hổng trong sự tôn trọng tiêu chuẩn để điều này?
Có liên quan: http://stackoverflow.com/questions/13532784/why-can-i-use-auto-on-a-private-type – OMGtechy
Tôi không thể nhận được ['HideType :: type b = .. .'] (http://ideone.com/jwsXhG) để biên dịch, bạn có thể hiển thị MCVE ở đâu không? Bạn có thể quan tâm đến [cấu trúc cướp] của litb (http://stackoverflow.com/questions/15110526/allowing-access-to-private-members) để thay thế. –