我有以下代码:
文件:Foo.h
class Foo {
friend void Bar();
};
档案:Foo.cpp
void Bar() {};
文件Test.cpp
#include "Foo.h"
int main(void) {
Bar();
return 0;
}
VS2008对此进行了编译,没有任何错误或警告。 G ++ 4.3.4报告:
test.cpp: In function ‘int main()’:
test.cpp:8: error: ‘Bar’ was not declared in this scope
为什么?
最佳答案
我在“未回答”部分中找到了这个问题,但是对先前错误答案的注释确实构成了正确答案。因此,这是带有该内容的社区Wiki响应。
摘要:GCC似乎拒绝了良好的代码。
11.4.5涵盖了在类内部定义(不仅声明)朋友函数的情况(“当且仅当该类是非本地类时,才能在类的朋友声明中定义函数是不合格的,并且该函数具有名称空间范围”-您的示例满足了这些要求。我猜想标准确实允许在类内部声明朋友功能(“原型”)。 g ++生成的错误使我感到困扰。 – liori 11月22日20:35
还有11.4.3:“首先在friend声明中声明的函数具有外部链接(3.5)。否则,该函数保留其先前的链接(7.1.1)。”我认为这可以达成协议。 – Potatoswatter 0秒前[删除此评论]