模板类中的方法仅适用于某些模板参数的正确

时间:2016-07-22 09:02:47

标签: c++ templates template-instantiation

考虑以下模板类

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 ++标准中的相关段落在哪里。

1 个答案:

答案 0 :(得分:4)

在标准中,模板(14),模板实例化和专业化(14.7),隐式实例化(14.7.1)中指定。

  

3除非明确表示功能模板专业化   实例化或明确专门化的函数模板   专业化是在专业化时隐式实例化的   在需要函数定义存在的上下文中引用。

  

11实现不应隐式实例化函数   模板,成员模板,非虚拟成员函数,成员   class,或类模板的静态数据成员   需要实例化。