首页 > 编程语言 >C++常见异常汇总(二): undefined reference to

C++常见异常汇总(二): undefined reference to

时间:2024-09-07 17:55:03浏览次数:13  
标签:函数 reference 模版 定义 C++ Test main PrintContent undefined

文章目录

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");
	
}

标签:函数,reference,模版,定义,C++,Test,main,PrintContent,undefined
From: https://blog.csdn.net/BullKing8185/article/details/141992730

相关文章

  • C++复习day06
    一、内存管理1.课件上关于内存分配的题目intglobalVar=1;staticintstaticGlobalVar=1;voidTest(){staticintstaticVar=1;intlocalVar=1;intnum1[10]={1,2,3,4};charchar2[]="abcd";constchar*pChar3="abcd";int*ptr1=(in......
  • windows C++-并行编程-转换使用异常处理的 OpenMP 循环以使用并发运行时
    此示例演示如何将执行异常处理的OpenMP并行for循环转换为使用并发运行时异常处理机制。在OpenMP中,在并行区域中引发的异常必须由同一线程在同一区域中捕获和处理。未处理的异常处理程序会捕获逃离并行区域的异常,默认情况下会终止进程。在并发运行时中,在传递给任务组(例......
  • c++元对象实现
    c++元对象实现在C++中,元对象技术通常指的是运行时检查类型信息和对象信息的能力。C++11标准引入了typetraits和reflection的概念,允许我们在编译时获取和使用类型信息。下面是一个简单的C++类,使用了C++11的typetraits和C++17的std::any来实现元对象:  #include<iostrea......
  • C++ 调用 C# - AOT 方案
    一些C#AOT编译的笔记,整体感觉:简单很方便,但限制也很多,适用于比较单一的功能点。跨语言调用C#代码的新方式-DllExport-InCerry-博客园在.NET8下,直接添加<PublishAot>true</PublishAot>就可以支持了,需要注意一些限制,这里比较相关的是,不能使用Newtonsoft.Json做序列......
  • C++ 调用 C# - DllExport 方案
    3F/DllExport:.NETDllExportwith.NETCoresupport(aka3F/DllExportakaDllExport.bat)目前还不支持.NET6以及后续的版本,看起来作者生活上遇到了一些麻烦,暂时也不打算处理了无法使用.NET6工作·问题#197·3F/DllExport---Unabletogetworkingusing.NET6......
  • C++ 调用 C# - C++/CLI 方案
    C++/CLI方案是通过托管C++做中间层,来转发C#和C++之间的调用和数据传递。这个写法,C#不用做任何特殊的处理,正常写就可以。C++/CLI层新建一个C++/CLI项目,e.g.MedicalDbAccessWrapper,添加对C#项目的引用,注意,输出目录最好就是原生C++项目的输出目录,原生C++项目......
  • Qt C++编程 从入门到实践 彭源 清华大学出版社
    第一章程序设计基础1.2.1输入和输出操作iostream叫做标准输入输出流库头文件namespacestd叫做标准命名空间cout、cin叫做标准输出、输入流对象有时候看见std::cout的代码,是因为没有事先声明cout对象是从标准命名空间调用的,::叫做域解析运算符,作用就是指明cout这个对象是......
  • [C++ Daily] 递归锁解决标准锁的典型应用
    递归锁解决标准锁的典型应用先看源码:结果(在A种尝试锁住mutex_时失败,进程等待,死锁无法退出:将std::mutex用std::recursive_mutex替换:结果:解析:std::recursive_mutex允许同一个线程对同一个锁对象进行多次上锁,获得多层所有权.......
  • C++中的字符和字符串
    一:引言1、错误分析请先看一下以下代码#include<iostream>#include<utility>//包含pair和make_pair的定义intmain(){//创建pair对象std::pair<int,std::string>p1(1,"one");//使用make_pair创建pair对象autop2=std::make_pair(2,"t......
  • 迷宫,返回所有路径并排序(C++)(回溯+dfs)
    题意说明:要求给出一个m*n的矩阵迷宫,0代表入口,1代表道路,2代表墙体,3代表出口,要求返回从入口到出口的所有移动路径并按长短从小到大排序。移动路径:就是wasd的移动路径,如一共走三步:下,右,下,则输出:sds。代码如下:#include<iostream>#include<string>#include<vector>#include<alg......