未定义 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+
的所有候选者,必须检查所有关联的classes [=15] =] 功能。 Buffer<-5>
是关联的class,所以必须实例化。实例化失败,因此编译错误。参见 。
不知Buffer<-5>
是否一定要实例化,如果Buffer
未定义,为什么我们没有编译错误?
您可以(隐含地)仅从一个声明中实例化一个class模板;你得到一个不完整的 class 类型,就像 struct A;
([temp.inst]/2) 中的一样。用不完整的关联class做ADL当然不是错误的;有问题的 class 根本没有搜索朋友声明。
下面的程序可以编译(参见 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+
的所有候选者,必须检查所有关联的classes [=15] =] 功能。 Buffer<-5>
是关联的class,所以必须实例化。实例化失败,因此编译错误。参见
不知Buffer<-5>
是否一定要实例化,如果Buffer
未定义,为什么我们没有编译错误?
您可以(隐含地)仅从一个声明中实例化一个class模板;你得到一个不完整的 class 类型,就像 struct A;
([temp.inst]/2) 中的一样。用不完整的关联class做ADL当然不是错误的;有问题的 class 根本没有搜索朋友声明。