【问题标题】:ADL, Ordinary lookup and Dependent function call not working oOADL、普通查找和从属函数调用不起作用 oO
【发布时间】:2013-02-09 11:50:12
【问题描述】:

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

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

【问题讨论】:

    标签: c++


    【解决方案1】:

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

    【讨论】:

    • 我本可以做到的,而且效果很好。但为什么这不起作用? , 在实例化的时候它应该已经解决了,因为它是依赖调用
    • 好吧,在阅读了您的标准 sn-p 后,我认为它与我所说的不冲突,也不与 GCC 拒绝您的代码相冲突。我认为您介绍的不是正确的 C++。
    • 所以总而言之,您的意思是在实例化时不对依赖调用执行普通查找?
    • 我想是的。我真正的意思是,当我查看该代码时,它看起来是错误的,并且阅读您的标准 sn-p 并不会改变我的想法。 :)
    • 请考虑包含来自 c++ 标准的语句来支持您的猜测 :)
    猜你喜欢
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 1970-01-01
    • 2019-10-10
    相关资源
    最近更新 更多