C++如何正确使用类内模板类型 解决ret未声明编译错误
错误原因
ret是定义在quantity类模板内部的嵌套类型别名,作用域被限制在类的范围内,不会自动注入到外部作用域。你在main函数里直接写ret t时,编译器会在当前函数/全局作用域查找ret的定义,找不到自然抛出「未声明」错误。
单独调用q1.get_volume()不需要你显式写返回值类型,编译器处理成员函数调用时会自动在类的内部上下文匹配返回值定义,不需要你在外部作用域提前声明ret,所以能正常编译。
另外代码还有个不规范点:自定义头文件不要用尖括号包含,尖括号是给标准库/系统头文件用的,quantity.h是自行编写的头文件,应当改成#include "quantity.h",否则部分编译器会在系统路径下搜索,找不到对应头文件。
修复方法
选任意一种适配你的C++版本即可:
- C++11及以上版本直接用
auto做类型推导,写法最简洁,不需要记忆冗长的嵌套类型名:
#include "quantity.h" int main() { quantity<unsigned int> q1; auto t = q1.get_volume(); return 0; }
- 如果需要显式声明类型,必须加类作用域限定符,明确指定
ret所属的类:
#include "quantity.h" int main() { quantity<unsigned int> q1; quantity<unsigned int>::ret t = q1.get_volume(); return 0; }
- 如果你用C++17及以上版本,还可以用结构化绑定直接拆包返回的
pair,不需要单独声明pair对象:
#include "quantity.h" int main() { quantity<unsigned int> q1; auto [unit, val] = q1.get_volume(); // 直接拿到单位枚举值和对应数值 return 0; }
内容的提问来源于stack exchange,提问作者K_TGTK
相关产品推荐
相关产品推荐

