Проблема с вложенными шаблонами
Допустим, имеется некоторый класс:
class Base
{
public:
INLINE static int get_something()
{
return 777;
}
//....
};
А также объявлен следующий шаблонный класс A:
template <class TBase>
class A
{
public:
template <typename TObject>
INLINE static TObject get_something()
{
return (TObject)(TBase::get_something() + 1);
}
//....
};
Теперь мы можем использовать это в коде, например так:
double a = A<Base>::get_something<double>();
printf("A: %lf\n", a);
Отлично, всё работает! Однако добавим теперь шаблонный класс B, который можно рассматривать, как некоторую оболочку над A:
template <class TBase>
class B
{
public:
template <typename TObject>
INLINE static TObject get_something()
{
return (TObject)(A<TBase>::get_something<TObject>() + 1); //Тут компилятор ругается!
}
//....
};
И с ходу получаем от компилятора:
main.cpp: In static member function 'static TObject B<TBase>::get_something()':
main.cpp:38:57: error: expected primary-expression before '>' token
38 | return (TObject)(A<TBase>::get_something<TObject>() + 1);
| ^
main.cpp:38:59: error: expected primary-expression before ')' token
38 | return (TObject)(A<TBase>::get_something<TObject>() + 1);
При этом, если в выражении A<TBase>::get_something<TObject>() заменить шаблонный параметр TBase на явный тип Base, то всё снова работает:
template <class TBase>
class B
{
public:
template <typename TObject>
INLINE static TObject get_something()
{
return (TObject)(A<Base>::get_something<TObject>() + 1); //А тут всё хорошо...
}
//....
};
//...и мы можем это использовать в коде
float b = B<Base>::get_something<float>();
printf("B: %f\n", b);
Вопрос, что не нравится компилятору и как заставить его корректно разыменовывать параметр шаблона класса A, функция которого вызывается из шаблонной функции шаблонного класса B? Вот, как-то так.
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
Запишите так:
return (TObject)(A<TBase>::template get_something<TObject>() + 1);