6

khi biên dịch một số mã mà tôi gặp phải lỗi trình biên dịch có vẻ lạ đối với tôi và liên quan đến thừa kế, lớp lồng nhau, sử dụng khai báo và truy cập sửa đổi.Lớp lồng nhau bằng cách sử dụng khai báo và sửa đổi truy cập

Về cơ bản, ý định là dành cho loại có nguồn gốc để hiển thị lớp được bảo vệ lồng nhau của loại cơ sở.

Càng theo gương ngắn để chứng minh vấn đề:

class Base 
{ 
protected: 

    struct Nested 
    { 
     enum value_enum 
     { 
      val = 0, 
      val2, 
      val3 
     }; 
    }; 

}; 

class Derived : public Base 
{ 
public: 

    using Base::Nested; 
}; 


int main(int argc, char** argv) 
{ 
    //Base::Nested aa; // error, as (I) expected 
    //Base::Nested::value_enum ab; // error, as (I) expected 

    Derived::Nested ba; // works, as (I) expected 
    Derived::Nested::value_enum bb; // MSVC error, as (I) did not expect 


    return 0; 
} 

Xem live.

MSVC11 (v11.00.61030) cuộn cảm trên mã này với các lỗi sau:

error C2248: 'Base::Nested' : cannot access protected struct declared in class 'Base'

Cả GCC và Clang biên dịch này đúng, vì vậy không có khả năng trích dẫn những phần có liên quan từ tiêu chuẩn, tôi sẽ tranh luận đây là lỗi MSVC.

Có cách nào xung quanh vấn đề này với MSVC không?

+0

Tôi nghĩ rằng nhận được một lỗi tại thời gian biên dịch là tốt hơn so với chạy trong các vấn đề sau. –

+1

Vì được bảo vệ, chức năng chính tiêu chuẩn sẽ không thể truy cập được –

+3

@AliKazmi Điều gì được bảo vệ? 'Derived' thay đổi công cụ sửa đổi truy cập cho' Nested'; nó không được bảo vệ trong trường hợp này. Ngoài ra, 'value_enum' không được bảo vệ bên trong' Nested'. – namezero

Trả lời

1

Đối với MSVC các workaround sau đây hoạt động:

class Derived : public Base 
{ 
    public: 

    using Base::Nested; 
    typedef Base::Nested::value_enum value_enum; // add this 
}; 

int main(int argc, char** argv) 
{ 
    //Base::Nested aa; // error, as (I) expected 
    //Base::Nested::value_enum ab; // error, as (I) expected 

    Derived::Nested ba; // works, as (I) expected 
    Derived::value_enum bb = Derived::value_enum::val; // now works in MSVC 


    return 0; 
} 
Các vấn đề liên quan