友元函数的定义位置,以及模板类声明和定义位置 - 编译过程理解(如何避免undefined错误)

写在前面

之所以总结这两个知识点,是因为在编写练习题c5-5时突然遇到报错,经过一翻查找,总算有点搞明白了,记录下来,不一定理解准确,但起码可以解决问题了.

1. 友元函数的实现

  • 友元函数的声明位置
    • 首先必须是在类中
    • 至于是在public,protected,private无所谓,外界都可以直接调用
  • 友元函数的实现位置,也就是具体的定义(非声明)所在位置
    • 第1种方式(推荐):在宿主类中声明的同时直接提供定义
    • 将宿主类用一个新的namespace框起来,然后在其他cpp文件中提供友元的定义,但是需要使用类似 myNameSpace::operator<<() 这样的命名空间限定符

2. 模板类的编译过程

  • 先描述一下我遇到的问题:将模板类的声明放置在arrayList.h, 将相应的成员函数实现单独放置在arrayList.cpp, 最后在main.cpp中创建arrayList对象并调用相应的成员函数,总是遇到报错:
/usr/bin/ld: /tmp/cc0i2g6A.o: in function `main':
/home/xxx/Documents/vsCodeProjects/arrayList/main.cpp:8: undefined reference to `arrayList<int>::arrayList(int)'
/usr/bin/ld: /home/xxx/Documents/vsCodeProjects/arrayList/main.cpp:12: undefined reference to `arrayList<int>::insert(int, int const&)'
collect2: error: ld returned 1 exit status
  • 最终解决方案: 在main.cpp中将arrayList.h与arrayList.cpp同时include进来
  • 至于这样做的原因,自己画了张草图,用以理解模板类的编译过程和报错原因,以及常规函数为什么不会报错的原因.
  • 感觉理解的可能不是太精确,但从stackoverflow的若干答案中了解到大概是这个原因和过程,
    友元函数的定义位置,以及模板类声明和定义位置 - 编译过程理解(如何避免undefined错误)_第1张图片

你可能感兴趣的:(数据结构,算法与应用,C++语言描述)