Код неправильно компилируется в Visual Studio из-за способа обработки шаблонов (в основном они игнорируются, пока не будут созданы экземпляры). В вашем коде идентификатор B
не зависит от аргументов шаблона (T
) и поэтому должен быть доступен в контексте, где определен шаблон.
Поскольку B
наследует от A
, это делает все еще более сложным, поскольку в коде есть циклическая зависимость. Я бы пересмотрел дизайн, и если вы считаете, что так и должно быть, я бы объединил два заголовочных файла в один:
// merged.h
struct A {
A* ptr;
template<class T>
void method();
};
struct B : public A {
void invoke() {
printf("Method invoked\n");
}
};
template <typename T>
void A::method() {
((B*) ptr)->invoke();
}
Тем не менее, мой совет состоял бы в том, чтобы пересмотреть вопрос о том, имеет ли это отношение вообще смысл, поскольку method
налагает ограничение на то, что ptr
должно быть B
, и это звонит в некоторые колокола кода запах.