Доступ к защищенным элементам из шаблонной (статической) функции-члена - PullRequest
7 голосов
/ 28 января 2012

Хорошо, поэтому я выбираю модифицированный маршрут 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 <class T>
    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<B>(T *)' 
being compiled with
[
    T=B
]

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

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

B b;
b.foo<B>(&b);

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

1 Ответ

2 голосов
/ 28 января 2012

В первом случае bar - это виртуальная функция, и foo обращается к ней через указатель на A, вызывая таким образом указатель на функцию и указанный индекс Vtable, как макет класса A. Таким образом, это работает.

Однако во втором случае A::foo явно вызывает не виртуальную функцию из другого класса, к которому у нее нет доступа. B::bar - это не виртуальная перегрузка A::bar - это совершенно другая несвязанная функция.

Следовательно, боюсь, что friend class A; - это самое лучшее, что вы можете получить,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...