C 编译器未检查模板类中是否存在一种方法
C++ compiler does not check if a method exists in template class
我在 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
,该功能不是用于您对该模板的特定实例化的编译,因此编译器不会发出诊断。
许多元编程技术取决于这种行为。
相关文章:
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- 如何重写继承的嵌套类中存在的虚拟方法
- 在类的第一个/最后一个实例存在之前/之后调用一对函数.有没有更好的方法?
- std::is_invocable 用于测试任意方法是否存在的语法(不仅是运算符())
- 检查特定目录中是否存在与文件匹配的 abc* 的最佳方法
- 当元组给出参数时,如何检查方法是否存在?
- 有没有一种方法可以使用弗洛伊德-沃歇尔算法给出最短路径,其中存在负权重循环而不允许重叠边缘?
- C 编译器未检查模板类中是否存在一种方法
- C++中始终存在纯虚拟方法
- cpp 中是否存在一种数据结构,可以轻松地提供一种基于已存在的实例构建新结构的方法
- 为什么父母的方法在孩子被摧毁后仍然存在
- 在OPENCV中,仅在C 中存在某些方法,如何在Python中做同一件事
- 在VS2015上使用SFINAE的模板上检查方法存在
- 检查是否存在模板方法,而不依赖自动模板扣除
- 无法使方法存在检测机制正常工作
- 检查是否存在多维映射的元素的最快方法是什么
- C 编译时间检查模板类型中是否存在方法
- 为什么当其他类别存在时,为什么不从其对象文件中使用一种类方法
- VS2015 中的方法存在检查器代码中断
- 基于方法或自由函数存在的模板构造函数解析