C++模板参数使用困惑:类型与静态成员访问相关疑问
C++模板参数常见困惑解答
问题1:模板参数是类型还是对象?为何能通过类型访问M1::value?
- 模板中用
typename(或class)声明的参数永远是类型参数,不存在“动态区分类型和对象输入”的机制。你提到的Measure<10,Unit::m>是实例化后的模板类类型,不是对象——对象是该类型的具体实例(比如Measure<10,Unit::m> my_measure;里的my_measure才是对象)。 - 能通过
M1::value访问,是因为Measure模板类中定义了静态成员变量value。静态成员属于类本身,不需要创建对象就能通过类类型直接访问,这是C++的基础语法,比如标准库中的std::string::npos就是典型的通过类型访问静态成员的例子。
问题2:Measure_add为何能访问M1::value?传入无value的类型会怎样?
Measure_add能访问M1::value和M2::value,是因为我们在实例化这个模板时,传入的M1、M2都是预先定义好的、带有value静态成员的类型(比如Measure<...>)。- 如果传入没有
value成员的类型,编译阶段就会直接报错。C++模板采用“实例化时检查”的机制,当编译器尝试用不符合要求的类型实例化Measure_add时,会发现无法解析M1::value这类成员访问,直接终止编译并给出错误提示,不会等到运行阶段才出现问题。
内容的提问来源于stack exchange,提问作者Chrsi
相关产品推荐
相关产品推荐

