• 模板的注意事项


    目录

    swap函数:

    模板不支持分离编译

    声明和定义分离的好处


    swap函数

    1. #include
    2. using namespace std;
    3. template <class T>
    4. void swap(T&left, T&right)
    5. {
    6. T temp = right;
    7. right = left;
    8. left = temp;
    9. }
    10. int main()
    11. {
    12. int a = 10, b = 20;
    13. swap(a, b);
    14. return 0;
    15. }

    进行运行会报错:

     

    如果我们要调用自己写的函数:

    1. #include
    2. using namespace std;
    3. namespace sk
    4. {
    5. template <class T>
    6. void swap(T&left, T&right)
    7. {
    8. T temp = right;
    9. right = left;
    10. left = temp;
    11. }
    12. }
    13. int main()
    14. {
    15. int a = 10, b = 20;
    16. sk::swap(a, b);
    17. return 0;
    18. }

    模板不支持分离编译

    我们可以在头文件中直接定义模板类,这样使用没有问题:

    1. #include
    2. using namespace std;
    3. template<class T>
    4. class Stack
    5. {
    6. public:
    7. Stack(int capacity = 4)
    8. {
    9. _a = (T*)malloc(sizeof(T)*capacity);
    10. if (_a == nullptr)
    11. {
    12. perror("malloc fail");
    13. exit(-1);
    14. }
    15. _top = 0;
    16. _capacity = capacity;
    17. }
    18. void Push(const T& x)
    19. {
    20. _a[_top++] = x;
    21. }
    22. ~Stack()
    23. {
    24. free(_a);
    25. _a = nullptr;
    26. _top = _capacity = 0;
    27. }
    28. private:
    29. T*_a;
    30. size_t _capacity;
    31. size_t _top;
    32. };
    1. int main()
    2. {
    3. Stack<int> st;
    4. st.Push(1);
    5. st.Push(2);
    6. return 0;
    7. }

    假如我们要分离编译:

     

    链接错误。

     

     错误原因:

     简而言之:

    模板需要实例化,我们在实例化时只有函数的声明,函数的定义没有实例化,所以找不到对应函数的地址。

     解决方法就是在模板函数定义的位置显示实例化

    1. #include"Stack.h"
    2. template<class T>
    3. Stack::Stack(int capacity = 4)
    4. {
    5. _a = (T*)malloc(sizeof(T)*capacity);
    6. if (_a == nullptr)
    7. {
    8. perror("malloc fail");
    9. exit(-1);
    10. }
    11. _top = 0;
    12. _capacity = capacity;
    13. }
    14. template<class T>
    15. void Stack::Push(const T& x)
    16. {
    17. _a[_top++] = x;
    18. }
    19. template<class T>
    20. Stack::~Stack()
    21. {
    22. free(_a);
    23. _a = nullptr;
    24. _top = _capacity = 0;
    25. }
    26. template
    27. class Stack<int>;

    假如我们再创建一个double类型的对象:

    我们还需要在定义的地方再显示实例化一个double类型的。

    1. template
    2. class Stack<int>;
    3. template
    4. class Stack<double>;

    每次加一个不同的类型的对象,就需要显示实例化一个,很麻烦,所以模板最好不要使用分离编译。

    我们可以把声明和定义写在同一个文件里

    1. #include
    2. using namespace std;
    3. template<class T>
    4. class Stack
    5. {
    6. public:
    7. Stack(int capacity = 4);
    8. void Push(const T& x);
    9. ~Stack();
    10. private:
    11. T*_a;
    12. size_t _capacity;
    13. size_t _top;
    14. };
    15. template<class T>
    16. Stack::Stack(int capacity = 4)
    17. {
    18. _a = (T*)malloc(sizeof(T)*capacity);
    19. if (_a == nullptr)
    20. {
    21. perror("malloc fail");
    22. exit(-1);
    23. }
    24. _top = 0;
    25. _capacity = capacity;
    26. }
    27. template<class T>
    28. void Stack::Push(const T& x)
    29. {
    30. _a[_top++] = x;
    31. }
    32. template<class T>
    33. Stack::~Stack()
    34. {
    35. free(_a);
    36. _a = nullptr;
    37. _top = _capacity = 0;
    38. }

    声明和定义分离的好处

    1:方便保护源码

    2:阅读方便。

  • 相关阅读:
    HIVESQL的列转行和行转列使用总结
    jspm基于ssm的乐聘网人才招聘系统
    Redis 持久化 - RDB 与 AOF
    MASA MAUI Plugin (五)Android 指纹识别
    Zookeeper的功能简介
    理解session,Cookie,token以及js-cookie在实际开发中的使用
    Android GB28181设备接入端语音广播和语音对讲技术实现探究
    实人认证API的出现,让电子化身份验证更加可靠
    【云原生 二】 Docker架构演进过程
    uni-app:实现当前时间的获取,并且根据当前时间判断所在时间段为早上,下午还是晚上
  • 原文地址:https://blog.csdn.net/qq_66581313/article/details/133297366