程序适用于 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
我有以下程序可以在我的机器上使用 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