Доступ к защищенным членам из шаблонной (статической) функции-члена

Хорошо, поэтому я использую своего рода модифицированный маршрут CRTP , чтобы избежать поиска виртуальных функций. Но я просто не могу понять одну ошибку, которую это дает мне ...

Итак, я пытаюсь перевести:

class A
{
public:
    static void foo(A *pA)
    {
        pA->bar();
    }

protected:
    virtual void bar()
    {
        TRACE0(_T("A::bar\n"));
    }
};

class B : public A
{
protected:
    virtual void bar()
    {
        TRACE0(_T("B::bar\n"));
    }
};

, который работает должным образом, на:

class A
{
public:
    template 
    static void foo(T *pT)
    {
        pT->bar();
    }

protected:
    void bar()
    {
        TRACE0(_T("A::bar\n"));
    }
};

class B : public A
{
protected:
    void bar()
    {
        TRACE0(_T("B::bar\n"));
    }
};

, что дает ошибку:

error C2248: 'B::bar' : cannot access protected member declared in class 'B'
see declaration of 'B::bar'
see declaration of 'B'
see reference to function template instantiation 'void A::foo(T *)' 
being compiled with
[
    T=B
]

Теперь я знаю, это легко исправить, добавив класс друзей A; к классу B, но это не очень удобно. Разве нет другого пути?

РЕДАКТИРОВАТЬ: Пример использования:

B b;
b.foo(&b);

РЕДАКТИРОВАТЬ № 2: Статическая функция-член foo не имеет значения, я заметил.

7
задан demorge 27 January 2012 в 20:34
поделиться