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

1、概述

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

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

cpp 复制代码
template <typename T>
class Demo
{
public:
    Demo(T value);

private:
    T m_value;
};

demo.cpp

cpp 复制代码
#include "demo.h"

template <typename T>
Demo<T>::Demo(T value) : m_value(value)
{
}

main.cpp

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

相关推荐
2501_94186496几秒前
科学记忆法提升学习效率
学习
好奇龙猫5 分钟前
【日语学习-日语知识点小记-日本語体系構造-JLPT-N2前期阶段-第一阶段(4):单词语法】
学习
别了,李亚普诺夫12 分钟前
运算放大器的参数、选型与应用-学习笔记
笔记·学习
知识分享小能手20 分钟前
Oracle 19c入门学习教程,从入门到精通,PL/SQL 编程详解:语法、使用方法与综合案例(6)
sql·学习·oracle
richxu2025100123 分钟前
嵌入式学习之路->stm32篇-->(8)I2C通讯(上)
stm32·嵌入式硬件·学习
zephyr0523 分钟前
C++ STL unordered_set 与 unordered_map 完全指南
开发语言·数据结构·c++
行业探路者29 分钟前
如何利用二维码提升富媒体展示的效果?
大数据·人工智能·学习·产品运营·软件工程
大锦终29 分钟前
dfs解决FloodFill 算法
c++·算法·深度优先
一只小bit36 分钟前
Qt 事件:覆盖介绍、处理、各种类型及运用全详解
前端·c++·qt·cpp
追烽少年x39 分钟前
第三章 异常(一)
c++