#include <iostream>
namespace oo{
class A{
public:
template<typename T>
static T get_value(){return static_cast<T>(55);}
};
template <typename T=A>
class B{
public:
static double f(){return T::get_value<double>();}
};
}
int main(int argc, char *argv[])
{
using std::cout;
using std::endl;
cout << oo::B<oo::A>::f() << endl;
return 0;
}
考虑到这里的示例,它会编译错误“不允许类型名称”,它引用“double”和“get_value()”中的参数。
有人通过重写函数f()来纠正这个错误:
static double f(){return T::template get_value<double>(); }
然而,我不太明白这里使用“模板”。有人可以向我解释一下吗?
提前感谢您的意见。
答案 0 :(得分:0)
这是在运行时发生的事情。
namespace oo{
class A{
public:
// template<typename T> // T replaced with <double> type.
static double get_value(){return static_cast<double>(55);}
};
//template <typename T=A> // T replaced with <oo::A> type.
class B{
public:
static double f(){return oo::A::get_value/*<double>*/();}
};
}
int main(int argc, char *argv[])
{
using std::cout;
using std::endl;
cout << oo::B::f() << endl;
return 0;
}
这一行: static double f(){return T :: get_value();} 是正确的,通常会编译没有任何错误(取决于你正在使用的巫婆编译器),因为模板声明将对下一个范围有效。
template <class T>
class foo
{
//T will be valid in this scope.
};
实现模板类/函数不是这种情况,您通常希望在需要防止使用多次重载的情况下执行此操作。
答案 1 :(得分:0)
原因是编译器如何解释该行,当您使用模板时,语法有多种可能的解释,请看下面的内容:
static double f()
{
return T::get_value < double > ();
}
在你的函数中,你现在如何传递给B类的T参数有一个名为get_value的函数或一个名为get_value的数据成员?如果案例是第二个,那么你使用运算符lees - 而不是在该成员和double之间,然后在double和()之间。那么编译器的第一个假设是这些选项,如果你想告诉他这是一个带模板的函数(为了正确解释“&lt;”)你需要把关键字模板