假设我们有一些课程:
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的模板函数调用的?类似的东西。