友元函数的定义位置,以及模板类声明和定义位置 - 编译过程理解(如何避免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的若干答案中了解到大概是这个原因和过程,
    在这里插入图片描述
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值