C 编译器未检查模板类中是否存在一种方法

C++ compiler does not check if a method exists in template class

本文关键字:存在 方法 一种 是否 编译器 检查      更新时间:2023-10-16

我在 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(); }
};

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

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"没有名为" paster_value"成员;您的意思是"促进"?

C++为什么会这样?

模板类方法在使用之前才实例化。一旦尝试调用promote()或甚至像以下&Val<int>::promote一样获得其地址,您就会遇到错误。

来自C 标准:

§17.8.1.10实施不得隐含实例化功能 模板,可变模板,成员模板,非虚拟成员 功能,成员类,类模板的静态数据成员, 或代替constexpr if语句(9.4.1(,除非这样 需要实例化。

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

因为 Val<int>(4).val(); call promote,该功能不是用于您对该模板的特定实例化的编译,因此编译器不会发出诊断。

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