【发布时间】:2009-02-05 12:57:08
【问题描述】:
当涉及到引用类型推导时,我是否必须显式实例化函数模板的类型。如果是这样的话,歧义在哪里?让我们比较以下2个代码sn-ps:
template <typename T>
void foo(T& var, void(*func)(T&)) // T must be instantiated with int and it does .
{
++var;
}
void ret(int & var){}
int main()
{int k =7;
foo(k, &ret);
cout<<k;//prints 8
}
现在让我们删除 foo() 的 decleration 中的 &',我们有一个错误。
template <typename T>
void foo(T var, void(*func)(T)) // T must be instantiated with int& but it doesn't.
{
++var;
}
void ret(int & var){}
int main()
{int k =7;
foo(k, &ret); //error: no matching function for call to 'foo(int&, void (*)(int&))'
cout<<k;
}
但是,如果我通过使用<int&> "foo<int&>(k,&ret);" 显式实例化来调用 foo,则代码会给出与前一个相同的输出。这个错误的原因是什么?歧义在哪里?
谢谢。
【问题讨论】: