面试:类模版中函数声明在.h,定义在.cpp中,其他cpp引用引入这个头文件,会有什么错误?

devtools/2025/1/11 14:49:31/

1、概述

类模版中函数声明在.h,定义在.cpp中,其他cpp引用引入这个头文件,会有什么错误?
报编译错误:error C2512: 'Demo<int>': no appropriate default constructor available

举例如下代码:
demo.h 声明模版类

template <typename T>
class Demo
{
public:Demo(T value);private:T m_value;
};

demo.cpp

#include "demo.h"template <typename T>
Demo<T>::Demo(T value) : m_value(value)
{
}

main.cpp

#include "demo.h"
int main()
{Demo<int> demo;return 0;
}

2、原因

模版不是在编译时立即生成代码,而是在使用时(即实例化时)根据传入的参数,来生成具体的代码。

编译器要看到完整的模版定义,才能生成具体的函数代码。

如果模版的定义不在当前编译单元可见,编译器就不知道如何生成特定类型的实例化模版,就会报编译错误。

如上编译main.cpp文件时:编译器会根据demo<int>语句来生成Demo<int>的具体版本,但是模版的定义在demo.cpp文件中,编译main.cpp时是无法看到的,所以只有声明,没有实现,所以报错了"error C2512: 'Demo<int>': no appropriate default constructor available"

这里有一个问题:为什么普通函数 声明 和定义分开,编译就没有报错呢?
1、普通函数- 编译阶段

      当编译器编译一个源文件时,会根据文件中函数的调用去查找函数声明,如果找到了匹配的声明,编译器就认为这个函数存在,并生成一个对外部符号的引用。

2、普通函数-链接阶段

       (1)、在所有源文件被单独编译之后,链接器的任务是将所有生成的目标文件(.o 或 .obj 文件)合并成一个可执行文件或库。
       (2)、链接器会解析每个目标文件中的外部符号引用,并尝试在其他目标文件中找到对应的定义。
       (3)、如果所有被引用的符号都能找到定义,那么链接成功;否则,就会出现“未定义的引用”这样的链接错误。

3、解决办法

模版函数的声明和定义一般需要在一起

学习链接:https://github.com/0voice


http://www.ppmy.cn/devtools/149630.html

相关文章

智元机器人完成 1000 台通用具身机器人下线

2025 年 1 月 6 日&#xff0c;智元机器人宣布其量产的第 1000 台通用具身机器人正式下线245。此次下线的机器人中&#xff0c;双足人形机器人 731 套&#xff0c;型号为远征 A2、灵犀 X1&#xff1b;轮式通用机器人 269 套&#xff0c;型号为远征 A2-D、A2-W57。 智元机器人位…

HarMonyOS 鸿蒙系统使用 Grid构建网格

网格布局是由“行”和“列”分割的单元格所组成&#xff0c;通过指定“项目”所在的单元格做出各种各样的布局。网格布局具有较强的页面均分能力&#xff0c;子组件占比控制能力&#xff0c;是一种重要自适应布局&#xff0c;其使用场景有九宫格图片展示、日历、计算器等。 Ar…

解决nginx多层代理后应用部署后访问发现css、js、图片等样式加载失败

一般是采用前后端分离部署方式&#xff0c;被上一层ng代理后&#xff0c;通过域名访问报错&#xff0c;例如&#xff1a;sqx.com.cn/应用代理路径。 修改nginx配置&#xff0c;配置前端页面的路径&#xff1a; location / {proxy_pass http://前端页面所在服务器的IP:PORT;pro…

RT-Thread Studio中的静态线程是什么

RT-Thread Studio中的静态线程是RT-Thread实时操作系统中线程的一种创建方式。以下是对RT-Thread Studio中静态线程的详细解释&#xff1a; 一、定义与特点 定义&#xff1a; 静态线程是在编译时就确定了线程的数量和属性&#xff0c;将线程的控制块和堆栈空间预分配好&#x…

js装饰器模式

装饰器模式是一种结构型设计模式&#xff0c;它允许你在不改变对象结构的情况下&#xff0c;动态地给对象添加新的行为或职责。 装饰器模式通过创建一个装饰器类&#xff0c;来包装原始对象&#xff0c;并在不改变原始对象的基础上&#xff0c;为其添加新的功能。装饰器类和原始…

【Linux】gawk编辑器

一、基本介绍 相较于sed编辑器来说&#xff0c;gawk提供了一种编程语言&#xff0c;而不仅仅是编辑器命令。 在gawk编程语言中&#xff0c;可以实现以下操作&#xff1a; 定义变量来保存数据&#xff1b;使用算术和字符串运算符来处理数据&#xff1b;使用结构化编程语法&…

自动化巡检系统如何提高运维效率?

一、自动化巡检系统简介 &#xff08;一&#xff09;定义与基本原理 自动化巡检系统是一种借助先进的信息技术&#xff0c;旨在对各类系统进行高效、精准监测的智能化工具。它主要依靠预设的脚本、专业的监测工具以及相关的软件模块&#xff0c;按照既定的规则和流程&#xff0…

Wireshark编译手册(Windows)

以下是对 Wireshark 官方文档中“Windows 平台的设置和构建说明”部分的翻译和总结&#xff1a; 2.2. Windows 平台 本节提供了在 Windows 上进行 Wireshark 开发的快速设置指南&#xff0c;包含推荐的配置。 2.2.1. 使用 Microsoft Visual Studio 注意&#xff1a;除非您非…