我有以下代码:
文件:Foo.h
class Foo {
friend void Bar();
};
档案:Foo.cpp
void Bar() {};
File 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
为什么?
答案 0 :(得分:2)
我在“未答复”部分找到了这个问题,但对之前错误答案的评论确实构成了正确答案。因此,这是一个包含该内容的社区维基回复。
总结:GCC似乎拒绝了良好的代码。
在类中定义(不仅声明)友元函数的情况由11.4.5涵盖(“当且仅当该类是非本地类时,才能在类的朋友声明中定义函数,函数名称是不合格的,函数具有命名空间范围“ - 您的示例满足这些要求)。我想该标准确实允许在类中的友元函数的声明(“原型”)。这是g ++产生的错误让我感到困扰。 - liori 11月22日20:35
同样11.4.3:“在朋友声明中首先声明的函数具有外部链接(3.5)。否则,该函数保留其先前的链接(7.1.1)。”我认为这可以达成协议。 - Potatoswatter 0秒前[删除此评论]
答案 1 :(得分:1)
friend
声明不算作原型。您还需要一个单独的原型:
// File: Foo.h
void Bar();
class Foo {
friend void Bar();
};
答案 2 :(得分:-2)
你们这些标准的知识摇滚,这是真的。但标准是标准的,标准的实施是完全不同的事情。我想你们一直只使用一个编译器,比如MSVC,它似乎遵循标准。虽然还有很多其他的编译器。
对于我和我5年的C / C ++经验,很明显Test.cpp没有看到Bar,因为它只包含了没有Bar声明的Foo.h。
我给John Kugelman +1,因为他的回答解决了问题。并且它不会因标准知识而发送垃圾邮件。