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