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

server/2025/1/12 4:56:00/

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/server/157669.html

相关文章

K-means算法在无监督学习中的应用

K-means算法在无监督学习中的应用 K-means算法是一种典型的无监督学习算法&#xff0c;广泛用于聚类分析。在无监督学习中&#xff0c;模型并不依赖于标签数据&#xff0c;而是根据输入数据的特征进行分组。K-means的目标是将数据集分成K个簇&#xff0c;使得同一簇内的数据点…

【解决方案】Golang结构体传0被忽略

【解决方案】Golang结构体传0被忽略 在 Go 语言中&#xff0c;当结构体字段标记为 omitempty 时&#xff0c;在将结构体序列化为 JSON 或其他格式时&#xff0c;如果字段的零值&#xff08;比如数字类型的0、字符串类型的空字符串等&#xff09;会被忽略&#xff0c;不会被序列…

【Linux】lnav - 适用于Linux和Unix的出色终端日志文件查看器

lnav 工具有哪些独特的功能&#xff1f; 你可以根据需要实时解压缩日志文件&#xff0c;类似于 Linux 和 Unix 上的 z* 工具。自动检测日志文件格式。按时间合并多个文件&#xff0c;形成一个统一的视图。终端颜色支持&#xff0c;让你更容易发现错误和警告。支持通过 SSH (SF…

C++ 如何将 gRPC集成到机器人系统中

将 gRPC 集成到 C 机器人系统中可以显著提升系统的通信效率和性能。以下是一个基本的步骤指南&#xff1a; 安装 gRPC 和依赖项&#xff1a; 在 Linux 系统上&#xff0c;可以使用以下命令安装 gRPC 和其依赖项&#xff1a;sudo apt update sudo apt install -y build-essentia…

ingress-nginx-controller安装

ingress-nginx-controller安装 ingress-nginx-controller是配置ingress发布的基础。以下主要采用Helm安装。地址&#xff1a; GitHub - kubernetes/ingress-nginx: Ingress NGINX Controller for Kubernetes 1 Helm安装 安装不难&#xff0c;需要找到合适的压缩包就行。我自…

力扣经典题目之219. 存在重复元素 II

今天继续给大家分享一道力扣的做题心得今天这道题目是 219. 存在重复元素 II&#xff0c;我使用 hashmap 的方法来解题 题目如下&#xff0c;题目链接&#xff1a;219. 存在重复元素 II 1&#xff0c;题目分析 此题目给我们了一个整数数组 nums 和一个整数 k &#xff0c;需要…

国内 Docker 服务状态 镜像加速监控

根据Docker 服务状态选择线路&#xff0c;并且使用多个镜像源来提高镜像下载速度 https://status.1panel.top/status/docker # 将内容写入 /etc/docker/daemon.json 文件&#xff0c;root 用户可以去掉 sudo # 配置 Docker 镜像&#xff0c;使用多个镜像源来提高镜像下载速度…

车载数据结构 --- ARXML VS JSON

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…