C++模板——待决名
C++模板——待决名
本文将持续更新,如果有了解这块内容的小伙伴欢迎评论区留言,最近遇到这个问题很多次了😭
概念
参考官方文档:
简单来说:
template<typename T> struct X { void f_x(){} }; template<typename T> struct Y : X<T> { void f_y() { f_x(); // 非待决名,函数查找在不知道T的具体类型时(即模板未实例化)就查找【立即绑定】 this->f_x(); // 待决名,函数查找在知道T的具体类型时(即模板已实例化)才查找【待会绑定】 } }
我们应该在待决名的情况下,使用待决名的成员;在非待决名的情况下,使用非待决名的成员。
在模板中的使用
参考官方文档:无限定的名字查找 - cppreference.com
问题
问题1:
#include <iostream> template<typename T = int> class Base { public: Base() :m_a(0) {} Base(T a) :m_a(a) {} virtual void func(){ // 假设T类型重载了<<运算符且能被输出 std::cout << "Base func()" << m_a << std::endl; } protected: T m_a; }; template<typename T = int> class Derived :public Base<T> { public: Derived() : Base<T>() {} Derived(T a, T b) :Base<T>(a), m_b(b) {} void func() override { // 假设T类型重载了<<运算符且能被输出 std::cout << "Derived func()" << m_a << " " << m_b << std::endl; // m_a是非待决名 } private: T m_b; }; int main() { Derived o(2.3, 1.4); o.func(); return 0; }
上述代码中,这句std::cout << "Derived func()" << m_a << " " << m_b << std::endl;
报错:m_a
未声明的标识符。
解决方案:
- 法1,让成员成为待决名的:将使用
m_a
改为this->m_a
,或使用显式指定m_a
命名空间为Base<T>::m_a
- 法2,保留成员为非待决名不动,让模板类实例化:在继承模板类时将模板类实例化为特定的类型,比如
Base<int>
,就不会报错了
问题2:
// 邻接矩阵 template <typename T = char> struct MGraph { T vex[MAX_VERTEX_NUM]; // 顶点表(用来存放顶点的信息) int edge[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵(用来存放边和边权) int vex_num, arc_num; // 当前的顶点数和弧数 }; // 邻接表 struct ArcNode { // 边表结点 int adjvex; // 出边终点在顶点表中的下标 ArcNode* next; }; template <typename T = char> struct VNode { // 顶点表结点 T data; ArcNode* first; }; template <typename T = char> struct ALGraph { // 邻接表类型 VNode<T> node[MAX_VERTEX_NUM]; // 顶点表,其中的每个顶点都连着一个出边表 int vex_num, arc_num; // 当前的顶点数和弧数 }; // 将邻接表转为邻接矩阵 template <typename T = char> void convertToMatrix(ALGraph<T>& g, MGraph<T>& m) { for (int i = 0; i < g.vex_num; i++) { auto p = g.node[i].first; // first是非待决名。不过这里编译能通过,只不过这里写auto的话用不了代码提示了 while (p != nullptr) { m.edge[i][p->adjvex] = 1; p = p->next; } } }
解决方案:
- 法1,让
first
成为待决名的,即用typename
关键字显式指定p
的类型:typename Graph::ArcNode* p = g.node[i].first;
- 法2,保留成员为非待决名不动,让模板函数实例化
本文作者:3的4次方
本文链接:https://www.cnblogs.com/3to4/p/17752017.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步