是 C++ gcc HEAD 10.0.0 20190 相对于好友函数的错误吗?
Is it a bug of C++ gcc HEAD 10.0.0 20190 relative to friend functions
以下程序使用clang HEAD 10.0.0
#include <iostream>
template <class T>
void f( const T & );
class A
{
public:
A( int x = 0 ) : x( x ) {}
friend void ::f( const A & );
private:
int x;
};
template <class T>
void f( const T &t )
{
std::cout << "t.x = " << t.x << 'n';
}
int main()
{
A a( 10 );
f( a );
}
程序输出为
t.x = 10
但是当使用gcc HEAD 10.0.0 20190
编译器时,它会输出错误
prog.cc:11:32: error: 'void f(const A&)' should have been declared inside '::'
11 | friend void ::f( const A & );
| ^
是编译器的错误还是我做错了什么?
归档 91618。
[temp.friend]/1 内容如下:
类或类模板的友元可以是函数模板或类模板、函数模板或类模板的专用化,也可以是非模板函数或类。对于不是模板声明的友元函数声明:
- 如果 friend 的名称是限定或非限定模板 ID,则 friend 声明是指函数模板的专用化,否则,
- 如果 friend 的名称是限定 ID,并且在指定的类或命名空间中找到匹配的非模板函数,则 friend 声明引用该函数,否则,
- 如果 friend 的名称是限定 ID,并且在指定的类或命名空间中找到匹配的函数模板,则 friend 声明引用该函数模板的推导专用化 ([temp.deduct.decl](,否则,
- 该名称应为声明(或重新声明(非模板函数的非限定 ID。
第三个项目符号应该允许这样做:
template <class T> void f(T);
struct A {
friend void ::f(A);
};
::f
是一个限定 id,并且找到了匹配的函数模板,因此它应该可以工作。但是 gcc 要求我们写::f<>
,这是一个模板 ID,以遵守第一个项目符号。
相关文章:
- "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函数错误代码
- 为什么我会收到转换函数错误