繁体   English   中英

未实例化未定义的 class 模板以检查友元函数

[英]Undefined class template is not instantiated to check for friend functions

以下程序可以编译(参见godbolt ),但如果我们取消注释Buffer的定义,它将无法编译。

template <int size>
struct Buffer /*{ char buf[size]; }*/;

template <class T>
struct Wrapper { void operator+() {} };

Wrapper<Buffer<-5>> a;

void f() { +a; }

原因,未注释的版本无法编译: +a触发 ADL,并且要收集operator+的所有候选者,必须检查所有关联的类是否有friend函数。 Buffer<-5>是关联的 class,因此必须对其进行实例化。 实例化失败,因此编译错误。 看到这个问题

我想知道是否必须实例化Buffer<-5> ,如果未定义Buffer ,为什么我们不会出现编译错误?

可以(隐式)仅从声明中实例化 class 模板; 你得到一个不完整的 class 类型,就像从struct A; ( [temp.inst]/2 )。 当然,使用不完整的关联 class 执行 ADL 不是错误; 有问题的 class 根本没有搜索朋友声明。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM