C ++编译器不检查模板类中是否存在方法

时间:2019-07-04 16:16:30

标签: c++ templates

我在C++中遇到了以下程序:

template <class T>
class Val {
protected:
    T x0, x;
public:
    Val(T t = 1) : x0(t), x(1) {}
    T val() { return x; }
    void promote() { this->promote_value(); }
};

由于某种原因,即使没有方法Val<int>(4).val();promote_value()也可以正常工作。我试图删除模板:

class OtherVal {
protected:
    int x0, x;
public:
    OtherVal (int t = 1) : x0(t), x(1) {}
    int val() { return x; }
    void promote() { this->promote_value(); }
};

但是现在我得到一个错误:

  

错误:“ class OtherVal”类没有名为“ promote_value”的成员;你是说“促进”吗?

C++为什么会这样?

2 个答案:

答案 0 :(得分:11)

在使用模板类方法之前,不会实例化它们。一旦您尝试致电promote()或什至获得&Val<int>::promote这样的地址,就会收到错误消息。

根据C ++标准:

  

§17.8.1.10实现不得隐式实例化函数   模板,变量模板,成员模板,非虚拟成员   函数,成员类,类模板的静态数据成员,   或constexpr if语句(9.4.1)的子语句,除非这样   实例化是必需的。

答案 1 :(得分:8)

模板一直以这种方式工作,主要是为了便于使用。

由于Val<int>(4).val();不会调用 promote,因此该函数不会针对您对该模板的特定实例进行编译,因此编译器不会发出诊断信息。

许多元编程技术都取决于这种行为。