visual-studio-2008 - 在友好类中声明的友元函数,GCC 不编译

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

我有以下代码:

文件:Foo.h

class Foo {
    friend void Bar();
};

文件:Foo.cpp

void Bar() {};

文件测试.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

为什么?

最佳答案

我在“未回答”部分找到了这个问题,但对先前错误答案的评论确实构成了正确答案。因此,这是包含该内容的社区维基回复。

总结:GCC 似乎拒绝了好的代码。

11.4.5 涵盖了在类内部定义(不仅声明)友元函数的情况(“当且仅当该类是非局部类时,才能在类的友元声明中定义函数,函数名称是不合格的,并且函数具有命名空间范围”——您的示例满足这些要求)。我想该标准确实允许在类内声明(“原型(prototype)”)友元函数。困扰我的是 g++ 生成的错误。 – liori 11 月 22 日 20:35

还有 11.4.3:“在友元声明中首次声明的函数具有外部链接 (3.5)。否则,该函数将保留其先前的链接 (7.1.1)。”我认为这就达成了协议(protocol)。 – Potatoswatter 0 秒前 [删除此评论]

关于visual-studio-2008 - 在友好类中声明的友元函数,GCC 不编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1779709/

相关文章:

visual-studio-2008 - 如何让 Visual Studio 2008 对象测试台工作?

c++ - 使用未声明的标识符 'Token'

c++ - 如何使用 -std=c++17(可选、任意、string_view、变体)在 g++ 6.2.0 中包含 C++ 17 header

c++ - 函数重载的顺序很重要吗?

c++ - 最大的除数程序无法正常工作

visual-studio-2008 - VS2008 Xaml 编辑器完全不稳定

c++ - 使用 C++ 在 VS 中查找丢失的分号的最有效方法是什么?

c++ - 解释器如何在主要的 C++ 类中编写函数

PHP 警告 : PHP Startup: Unable to load dynamic library './lib.so' - ./lib.so: undefined symbol :* 在第 0 行未知

c++ - 在现代 C++ 中在函数声明中定义返回变量是否合法?