考虑以下模板类
template<typename T>
struct Caller {
void func(const T &t) { t.func(); }
void gunc(const T &t) { t.gunc(); }
};
现在让一些类Target
仅提供成员函数func()
,但不提供gunc()
,即
struct Target {
void func() const { /* ... /* }
};
模板实例化Caller<Target>
是否有效?
GCC,clang以及VC ++接受此类模板实例化。当然,调用Caller<Target>::gunc()
会导致错误,但Caller<Target>::func()
可以正常运行。
现在的问题是:这种宽容行为的背景是什么?C ++标准中的相关段落在哪里。
答案 0 :(得分:4)
在标准中,模板(14),模板实例化和专业化(14.7),隐式实例化(14.7.1)中指定。
3除非明确表示功能模板专业化 实例化或明确专门化的函数模板 专业化是在专业化时隐式实例化的 在需要函数定义存在的上下文中引用。
和
11实现不应隐式实例化函数 模板,成员模板,非虚拟成员函数,成员 class,或类模板的静态数据成员 需要实例化。