gpt4 book ai didi

c++ - 使用 typedef 的返回类型声明友元函数时出现编译器错误

转载 作者:行者123 更新时间:2023-12-01 14:53:48 26 4
gpt4 key购买 nike

最小的例子:

#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' (aka 'int') 不是类、命名空间或枚举

其他感兴趣的信息:
  • 由于未能解析 friend 声明,编译器还提示 bar() 是私有(private)的,这是意料之中的。
  • 如果您将 friend 声明更改为“friend int::someFunc();”示例代码无需任何其他更改即可编译。
  • 声明“typedef int myInt;”并且在 friend 声明中使用 myInt 作为返回类型也无法编译并出现相同的错误。
  • 似乎不是特定于平台的:MacOS 和 Android 工具链都出现

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

    编辑:通常情况下,我意识到问题出在太晚了。编译器正在解析此代码,就好像 someFunc 是 std::int32_t 的成员,这确实不是有效的语法。所以我的新问题是,在 friend 声明中::必须在 someFunc 之前的情况下,如何正确地解决 friend 声明?

    最佳答案

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

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

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

    Live example

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

    关于c++ - 使用 typedef 的返回类型声明友元函数时出现编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59669573/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com