The code:

template<typename T>
struct b1 {
protected:
    void    inc() {}
    T*      dummy;
    };
template<typename T, template<typename>class F>
struct b2 {
    void    f() {
        F<T>*   s = static_cast<F<T>*>(this);
        s->inc();
        }
    };

template<typename T>
struct G : public b1<T>, public b2<T, G> {

    };

int main() {
    G<int> g;
    g.f();
    }


gets you:

~/ootbc/members/src$ g++ foo.cc
foo.cc: In member function `void b2<T, F>::f() [with T = int, F = G]':
foo.cc:22:   instantiated from here
foo.cc:4: error: `void b1<T>::inc() [with T = int]' is protected
foo.cc:11: error: within this context

The access to "inc" is "s->inc()". "s" is a "F<T>", which after parameter 
substitution is a "G<int>". "b2<T, G>" is a public base of G, which after 
substitution means that "b2<int, G>" is a public base of "G<int>" and so is
also 
a public base of "s". Hence the protected member "b2<int, G>::inc" should be 
visible via "s", but is not.

Ivan


-- 
           Summary: Static_cast loses access to protected
           Product: gcc
           Version: 3.4.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: igodard at pacbell dot net


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24592

Reply via email to