3

这是给出的简单代码,我相信它应该可以根据 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) 的查找部分,仅找到来自模板定义上下文的函数声明。

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

4

1 回答 1

0

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

于 2013-02-09T12:17:39.153 回答