ADL,普通查找和从属函数调用不起作用oO

时间:2013-02-09 11:50:13

标签: c++

这里提供的简单代码应该符合c ++标准我相信

template<typename T> 
void foo(T x) 
{ 
    bar(x); 
    void bar(int);
} 

void bar(int)  { } 

int main() 
{ 
    foo(0); 
} 

错误来自GCC 4.7:

  

'bar'未在此范围内声明,且未找到任何声明   通过在实例化时依赖于参数的查找

但是在C ++标准中它是写的。 §14.6.4.2:

  

对于依赖于模板参数的函数调用,   使用通常的查找规则找到候选函数(3.4.1,   3.4.2,3.4.3)除了:

     

- 对于使用非限定名称查找(3.4.1)或限定名称查找(3.4.3)的查找部分,仅找到模板定义上下文中的函数声明。

我可能对所写的内容有错误的印象,有人可以在这里纠正我吗?

1 个答案:

答案 0 :(得分:0)

您应该将'bar'的声明移到顶部。因为在定义模板(未实例化)时,在调用'bar'之前,它尚未被声明。