C++ 本地类中友元函数的名称查找

C++ 本地类中友元函数的名称查找,c++,name-lookup,C++,Name Lookup,汇编以下文件: void bar() { /* ... */ } void foo() { struct MyStruct { friend void bar(); }; } int main() { //.. } 导致错误的原因: 错误:本地类中的友元声明“void bar()”没有事先声明 为什么名称查找失败?如何修复它?即使您是朋友,也无法访问其封闭范围之外的本地类,因为本地类的名称是其封闭范围的本地名称-§9.8/1 但是,如果您只

汇编以下文件:

void bar() { /* ... */ }

void foo()
{
    struct MyStruct
    {
        friend void bar();
    };
}

int main()
{
    //..
}
导致错误的原因:

错误:本地类中的友元声明“void bar()”没有事先声明


为什么名称查找失败?如何修复它?

即使您是朋友,也无法访问其封闭范围之外的本地类,因为
本地类的名称是其封闭范围的本地名称
-§9.8/1


但是,如果您只是想让它编译,请显式地告诉它在全局范围内查看

friend void ::bar();
*由于某些原因,这在VS中修复了它,但在GCC中没有

§11.3/11(感谢jrok)

如果友元声明出现在本地类(9.8)中,并且指定的名称是非限定名称,则会使用先前的 查找声明时不考虑位于最内层封闭非类范围之外的范围


在处理错误时,最好发布准确的错误消息。它可以帮助有相同问题的其他人找到您的问题。
错误:本地类中的好友声明“void bar()”,没有事先声明。
请使用错误消息更新问题。一般来说,回应澄清的请求时,更新你的帖子,而不是回复评论。首先,一个问题不需要阅读评论就可以理解。另一方面,QA&site也是如此,而不是论坛,评论不适合(也不适合)讨论。这也是我的想法,但失败的原因是它在VS2010中修复了相同的错误(GCC 4.6.1);VS2010中最初的警告是:
警告C4813:“bar”:本地类的友元函数必须在之前声明过
§9.8/1还说:本地类中的声明只能使用封闭范围中的类型名、静态变量、外部变量和函数以及枚举数。我仍然不确定
::bar()
是否正确。