使用typedef'ed返回类型声明友元函数时出现编译器错误

Compiler error when declaring a friend function with a typedef'ed return type

本文关键字:函数 错误 编译器 友元 声明 typedef 返回类型 ed 使用      更新时间:2023-10-16

>最小示例:

#include <cstdint>
std::int32_t someFunc();
namespace foo
{
class FooClass
{
private:
void bar(){}
friend std::int32_t ::someFunc();
};
}
std::int32_t someFunc()
{
foo::FooClass c;
c.bar();
return 0;
}

int main(int argc, const char * argv[])
{
return someFunc();
}

生成此代码会导致以下错误: pathTo/fooClass.hpp:8:17: 'int32_t'(又名'int'(不是类、命名空间或枚举

其他感兴趣的信息:

  • 由于无法解析 friend 声明,编译器还抱怨 bar(( 是私有的,这是意料之中的。
  • 如果将 friend 声明更改为 "friend int ::someFunc((;",则示例代码将在没有任何其他更改的情况下进行编译。
  • 声明"typedef int myInt;"并在友元声明中使用myInt作为返回类型也无法编译并出现相同的错误。
  • 似乎不是特定于平台的:MacOS和Android工具链都会发生

所以这似乎与朋友声明中的返回类型是一个 typedef 的事实有关,但我不明白为什么这会是一个问题。 有人可以解释为什么上面的代码无法编译吗?

编辑:通常情况下,我意识到问题出在哪里为时已晚。 编译器正在解析此代码,就好像某些 Func 是 std::int32_t 的成员一样,这确实不是有效的语法。 所以我的新问题是,在这种情况下,如何进行好友声明::必须在好友声明中的某个 Func 之前才能正确解决?

不确定这是否是一个错误。但是,当涉及到声明中的歧义时,解决方案通常是正确使用括号。您可以按如下方式修改您的好友声明

friend std::int32_t (::someFunc)();

这将强制范围解析运算符正确绑定到声明符 id 而不是类型。

现场示例

声明符的某些部分(甚至只是 id(通常可以括起来,有时它们需要括起来才能获得正确的含义。例如,返回指针的函数和指向函数的指针之间的古老差异

int *foo();
int (*bar)();