如果我们在这一函数模板,模板参数推导
template<typename T>
void f(T param) {}
然后我们就可以把它在以下几个方面,
int i=0;
f<int>(i);//T=int : no need to deduce T
f(i); //T=int : deduced T from the function argument!
//likewise
sample s;
f(s); //T=sample : deduced T from the function argument!
现在考虑上述函数模板的这个变体,
template<typename TArg, typename TBody>
void g(TArg param)
{
TBody v=param.member;
}
现在,可以在编译器推断模板参数,如果我们写,
sample s;
g(s); //TArg=sample, TBody=int??
假设sample
被定义为,
struct sample
{
int member;
};
基本上有两个问题:
- 编译器可以推断出在第二个例子中的模板参数?
- 如果不是,那为什么?有什么困难吗?如果标准没有说出“从函数体”“模板参数推导的任何内容,那么是不是因为参数不能推导出来?或者它没有考虑这样的推论,以避免增加语言的复杂性?或者是什么?
我想知道你对这样的推论的看法。
编辑:
顺便说,海湾合作委员会是能够推断出函数的参数,如果我们写这样的代码:http://www.ideone.com/cvXEA
不:
template<typename T>
void h(T p)
{
cout << "g() " << p << endl;
return;
}
template<typename T>
void g(T p)
{
h(p.member); //if here GCC can deduce T for h(), then why not TBody in the previous example?
return;
}
在这个例子中工作示范上例的工作演示:http://www.ideone.com/UX038
请你详细说明一下吗? – Nawaz 2011-01-25 21:50:32