Проблема с вложенными шаблонами

Допустим, имеется некоторый класс:

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);
→ Ссылка