程序适用于 PC 上的 GCC 7.5,但不适用于在线编译器

Program works on GCC 7.5 on PC but not on online compiler

我有以下程序可以在我的机器上使用 GCC 7.5.0 成功编译,但是当我尝试该程序时 here 该程序无法运行。

class Foo 
{
    friend void ::error() { }

};
int main()
{
    
    return 0;
}

错误 here 表示:

Compilation failed due to following error(s).

    3 |     friend void ::error() { }
      |                         ^

我的问题是什么问题,我该如何解决。

问题是限定 友元声明不能是定义。在您的示例中,由于名称 error 是限定的(因为它具有 ::),因此相应的朋友声明不能是定义。

这似乎是 GCC 7.5.0 中的错误。例如,对于 gcc 7.5.0,程序 works but for gcc 8.4.0 and higher it doesn't work.

解决这个问题的一种方法是删除 error 函数的主体 { } 并通过添加分号 [=15= 使其成为 声明 ] 如下图:

//forward declare function error()
void error();

class Foo 
{
    friend void ::error();//removed the body { } . This is now a declaration and not a definition

};
int main()
{
    
    return 0;
}
//definition of function error 
void error()
{
    
}

请注意,您还可以将函数 error() 的定义放在 class Foo 的定义之前,如图 here.

解决这个问题的另一种方法是删除 :: 并使 error 成为 不合格的名称 ,如图 here