我在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++
为什么会这样?
答案 0 :(得分:11)
在使用模板类方法之前,不会实例化它们。一旦您尝试致电promote()
或什至获得&Val<int>::promote
这样的地址,就会收到错误消息。
根据C ++标准:
§17.8.1.10实现不得隐式实例化函数 模板,变量模板,成员模板,非虚拟成员 函数,成员类,类模板的静态数据成员, 或constexpr if语句(9.4.1)的子语句,除非这样 实例化是必需的。
答案 1 :(得分:8)
模板一直以这种方式工作,主要是为了便于使用。
由于Val<int>(4).val();
不会调用 promote
,因此该函数不会针对您对该模板的特定实例进行编译,因此编译器不会发出诊断信息。
许多元编程技术都取决于这种行为。