一、解决的问题
1、其实是可以推导出函数的返回值类型的:
但是是无法在模版类的外面进行使用的
下面的两种情况是编译通过的:
(1)
template<class T>
T Print(T x)
{
return x;
}
(2)
template<class T>
struct A
{
T Print(T value)
{
return value;
}
};
2、解决T无法在类模版的外面进行使用的问题
例如:
函数定义:
template<class T>
struct B
{
B(T x)
:_a(x)
{}
typedef T ValueType;
T& operator*()
{
return _a;
}
T _a;
};
template<class T>
typename T::ValueType Fun1(T value)
{
return *value;
}
测试用例:
void Test()
{
B<int> b1(10);
cout<<Fun1(b1);
}
3、总结
定义了一个模版的函数,这个时候你传入的参数又是一个模版,这个时候怎么使用这个参数模版中的对应的类型,这个时候就可以使用,这个技术:
在参数模版的里面定义一个typededf T ValueType(一定要定义为public的为什么,自己思考),这个时候就可以使用 typename T::ValueType的方式拿到对应的类型,
为什么要加typename,这是因为编译器不知道这个ValueType到底是变量,还是对应的类型,加上typename之后,这个时候就告诉编译器是一个类型,这个时候就可以顺利的同过编译了