【发布时间】:2016-11-29 20:45:09
【问题描述】:
假设我有一个模板函数:
template <class T>
void tfoo( T t )
{
foo( t );
}
稍后我想将它与类型一起使用,因此我声明/定义了一个函数并尝试调用它:
void foo( int );
int main()
{
tfoo(1);
}
我从 g++ 收到错误:
‘foo’未在此范围内声明,并且在实例化点通过依赖于参数的查找未找到任何声明 [-fpermissive] 富(t);
为什么在实例化时找不到void foo(int)?它是在那个时候声明的。有没有办法让它工作(无需在模板之前移动foo 的声明)?
【问题讨论】:
-
不是因为the two phase lookup吗?
-
@W.F.实际上,由于两阶段查找,我希望它能够编译。
-
或许在函数模板中声明你要调用的函数会为你解决问题?
-
在我与 AnT 和 W.F. 的对话之后。在 cmets 中,带有允许使用 ADL 调用
foo的转换运算符的包装器怎么样?像这样:coliru.stacked-crooked.com/a/dc92e572d02f601a
标签: c++ name-lookup