Хорошо, поэтому я использую своего рода модифицированный маршрут 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
не имеет значения, я заметил.