使用typedef'ed返回类型声明友元函数时出现编译器错误
Compiler error when declaring a friend function with a typedef'ed return type
>最小示例:
#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)();
相关文章:
- "error: no matching function for call to"构造函数错误
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 尝试将unique_ptrs推送到向量时使用纯虚拟函数错误
- C++ OpenCV 卡尔曼滤波器构造函数错误
- C++:用户定义的显式类型转换函数错误
- C++ 合并字符串以'system'函数错误
- C++ wmain 函数错误时使用 Unicode
- 结构数组的构造函数错误,错误消息:没有构造函数实例与参数列表匹配
- C++ 中常量属性的初始化构造函数错误
- 线程 std::调用未知类型,无法专门化函数错误
- 表单显示对话框函数错误,并且不执行下面的语句
- 函数错误 C2059:语法错误:'>'不起作用
- STL向量上出现奇怪的复制构造函数错误
- C++ Visual Studio 重载函数错误:没有重载函数的实例与指定的类型匹配
- C++引用已删除函数错误
- 为什么通过带有文字编号的引用调用会出现"无匹配函数"错误?
- C++ 乘法定义的构造函数错误消息似乎错误
- 在 c++ 代码中将数组传递给函数错误
- FFMPEG avcodec_decode_video2函数错误代码
- 为什么我会收到转换函数错误