文章目录
1、undefined reference to A
- 检查所有main相关的定义,是否均已定义 A
- 检查 CMakeList.txt 中,是否包含了所有的 .cpp
2、undefined reference to `vtable
- 缺少构造、析构函数:请检查是否定义了构造、析构函数(尤其在 .cpp 文件中)
- 子类中未定义基类 virual func =0 ; 的函数实现
- CMakeList中,未添加对应的 .cpp 文件
- 模版函数的定义与实现,未同时定义在头文件中
注意:模版函数,尽量定义与实现一起定义在 头文件中,否则在外部调用时,会报 undefined 的错误。除非在 头文件中,再额外增加一个 显示类型调用此模版函数的 函数。
2.1 模版函数定义方案1: 定义与实现均一起定义在头文件中
Test.h
class A
{
public:
template<typename ValueType>
bool PrintContent(const ValueType &value)
{
std::cout << "the value :" << value << std::endl;
return true;
}
};
main.cpp
#include “Test.h”
void main()
{
A a;
a.PrintContent<std::uint64_t>(12345);
a.PrintContent<std::uint64_t>("Hello Test");
}
2.2 模版函数定义方案2: 定义的同一个文件中,显示声明具体类型
Test.h
class A
{
public:
template<typename ValueType>
bool PrintContent(const ValueType &value);
};
template<>
bool A::PrintContent(const std::uint64_t &value);
template<>
bool A::PrintContent(const std::string &value);
Test.cpp
template<typename ValueType>
bool A::PrintContent(const ValueType &value)
{
std::cout << "the value :" << value << std::endl;
return true;
}
main.cpp
#include “Test.h”
void main()
{
A a;
a.PrintContent<std::uint64_t>(12345);
a.PrintContent<std::uint64_t>("Hello Test");
}
3、multiple definition of
通常,.h 文件中,仅进行函数的定义(尤其是纯C函数),不定义函数的实现,除非:
-
定义模版函数
-
定义类成员函数
如果是在需要在.h 文件中定义函数的实现: 可通过增加 inline 修饰的方式
Test.h
template<typename ValueType>
inline bool PrintContent(const ValueType &value)
{
std::cout << "the value :" << value << std::endl;
return true;
}
main.cpp
#include “Test.h”
void main()
{
PrintContent<std::uint64_t>(12345);
PrintContent<std::uint64_t>("Hello Test");
}