• C++ 模板类编译前需要实例化


     在复习list容器的模拟实现,遇到了模板未实例化导致代码报错的问题,list的模拟实现可以看下面这篇文章,这里就不多赘述了,直接切入正题。C++list模拟icon-default.png?t=N7T8http://t.csdnimg.cn/N6BGh现在的情况是我们已经模拟实现了list类,想在全局写一个Print()函数,并使用模板来操作,方便我们打印任意类型的list,下面是代码。

    1. template<typename T>
    2. void Print(const list& lt)
    3. {
    4. list::const_iterator it = lt.begin();
    5. while (it != lt.end())
    6. {
    7. cout << *it << " ";
    8. it++;
    9. }
    10. cout << endl;
    11. for (auto e : lt)
    12. {
    13. cout << e << " ";
    14. }
    15. cout << endl;
    16. }

    代码部分很简单,就是一个迭代器遍历的问题,能保证我写的代码没有错,但是代码就是报错。

    使用手动创建一个迭代器是不被允许的,而使用范围for能编译通过(虽然范围for的本质也是迭代器)。

    后面我发现是模板还没有实例化的问题,因为list类也是使用模板来处理,因此一开始是不会实例化的。而我们代码中使用了这个还未实例化list类里面的const_iterator,他肯定是找不到这里面的内容的。

    因此我们得告诉编译器,你先不要急着去找类对象的实例化,等后面再去找,运行过来的时候,代码就没问题了。

    代码也肯简单,在list前面加上typename或者class关键字就可以了,代表这是个模板类,等下运行时再去找。

    有了这一层后,我们就可以进行list的打印了 

    但是我们写的代码仅仅是针对了list容器的打印,我想要一个能够支持所有容器的打印,就还得变形。

    我们可以不需要具体类型了,直接将类当成一个整体来处理,用Container来代替list,这样就避免了使用单一容器,任何容器只要有迭代器都可以访问。同时不要忘记加上typename

    1. template<typename Container>
    2. void Print(const Container& lt)
    3. {
    4. typename Container::const_iterator it = lt.begin();
    5. while (it != lt.end())
    6. {
    7. cout << *it << " ";
    8. it++;
    9. }
    10. cout << endl;
    11. }

     只能说泛型编程真的厉害!!!

  • 相关阅读:
    1108 Finding Average (PAT甲级)
    Orchestrator - server_id相同导致graceful-master-takeout-auto失败
    探讨Morest在RESTful API测试的行业实践
    哎,被这个叫做at least once的玩意坑麻了。
    JAVA培训之数据库表关联关系
    Miniconda、Vscode下载和conda源、pip源设置
    Kafka学习笔记
    自学网络安全的三个必经阶段(含路线图),小白必看
    JavaScript深浅拷贝实现
    scrollIntoView锚点跳转 超好用
  • 原文地址:https://blog.csdn.net/kkbca/article/details/133964207