友元函数在befriended类中声明,GCC不编译

时间:2009-11-22 19:30:55

标签: visual-studio-2008 g++ declaration friend

我有以下代码:

文件: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

为什么?

3 个答案:

答案 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,因为他的回答解决了问题。并且它不会因标准知识而发送垃圾邮件。