使用模板时模板的定义应该放到头文件

news/2024/10/18 2:36:28/

在使用函数模板之前,编译器必须看到不仅仅是一个声明,通常编译器需要完整的函数模板定义。换句话说,如果你在头文件中定义了一个模板,那么这个头文件必须包含该函数模板的主体。

假设需要在许多项目之间共用某个函数foo。通常情况下,会将函数声明放在一个头文件中,比如common.hpp,并将完整的定义放在一个单独的源文件中,比如common.cpp
然而,当该函数为函数模板时,通常会将定义放在头文件中。这是为了让编译器从模板创建具体的函数,比如foo<int>foo<long>,它需要函数模板的主体。

错误示例:
common.hpp

#pragma oncetemplate<class T>
T my_max(T a, T b);

common.cpp

#include "common.hpp"template<class T>
T my_max(T a, T b){return a > b? a: b;
}

main.cpp

// g++ -I. main.cpp common.cpp -O2
#include <iostream>
#include "common.hpp"int main() {std::cout << my_max<long>(12, 23U) << std::endl;std::cout << my_max<float>(42.f, 23U) << std::endl;
}

使用指令g++ -I. main.cpp common.cpp -O2编译时提示如下错误:

/usr/bin/ld: /tmp/ccfkfBWe.o: in function `main':
main.cpp:(.text.startup+0x14): undefined reference to `long my_max<long>(long, long)'
/usr/bin/ld: main.cpp:(.text.startup+0x3c): undefined reference to `float my_max<float>(float, float)'
collect2: error: ld returned 1 exit status

如上错误就是因为没有用模板生成对应的函数定义,报未定义的引用的错误。

正确示例:

common.hpp

#pragma oncetemplate<class T>
T my_max(T a, T b){return a > b ? a: b;
}

main.cpp

// g++ -I. main.cpp -O2
#include <iostream>
#include "common.hpp"int main() {std::cout << my_max<long>(12, 23U) << std::endl;      // 23std::cout << my_max<float>(42.f, 23U) << std::endl;   // 42
}

通过在编译指令中加--save-temps验证汇编代码中确实存在longfloat两个版本的函数实现。
g++ -I. main.cpp --save-temps -O2


http://www.ppmy.cn/news/1454996.html

相关文章

牛客储物点的距离

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 一个数轴&#xff0c;每一个储物点会有一些东西&#xff0c;同时它们之间存在距离。 每次给个区间[l,r],查询把这个区间内所有储物点的东西运到另外一个储物点的代价是多少&#xff1…

ES dsl查询filter(或must)和should并用时should子句不生效

记录下今天编码时遇到的问题&#xff0c;在filter和should同级并用的查询下&#xff0c;should子句并没有生效&#xff0c;只有filter子句生效。 例如以下dsl {"query": {"bool": {"filter": [{"term": {"status": 3}}],&…

区块链 | NFT 相关论文:Preventing Content Cloning in NFT Collections(一)

&#x1f436;原文&#xff1a; Preventing Content Cloning in NFT Collections &#x1f436;写在前面&#xff1a; 这是一篇 2023 年的 CCF-C 类&#xff0c;本博客只记录其中提出的方法。 A Robust NFT Collection Functionality 我们将在本节中提出一个定义。在假设有恶…

期权如何开户的流程是什么样的?

今天期权懂带你了解期权如何开户的流程是什么样的&#xff1f;期权账户开户是指投资者向期权经纪商或金融机构提交申请&#xff0c;以便可以在期权市场上进行交易并持有期权合约的账户开设过程。 期权如何开户的流程是什么样的&#xff1f; 1. 投资者参与营业部提供的股票期权…

百川2模型解读

简介 Baichuan 2是多语言大模型&#xff0c;目前开源了70亿和130亿参数规模的模型。在公开基准如MMLU、CMMLU、GSM8K和HumanEval上的评测&#xff0c;Baichuan 2达到或超过了其他同类开源模型&#xff0c;并在医学和法律等垂直领域表现优异。此外&#xff0c;官方还发布所有预…

富格林:了解黑幕套路正规方法预防

富格林悉知&#xff0c;存于市场中的黑幕亏损&#xff0c;不仅扰乱市场秩序&#xff0c;还使得不少的投资者受害亏损&#xff0c;面对诱导黑幕陷阱&#xff0c;一定要注意采取正规的方法防范避免受害亏损。投资者在进入市场之前&#xff0c;可从黑幕案件中了解黑幕亏损原因&…

pcb沉金工艺有什么作用:为何它成为电子制造的必备工艺?

在电子制造业中&#xff0c;PCB&#xff08;印刷电路板&#xff09;的质量和性能对于产品的整体表现至关重要。沉金工艺因其能够显著提升pcb的焊接性能、耐腐蚀性和导电性能&#xff0c;已成为电子制造不可或缺的一部分。 一、沉金工艺的作用 1.焊接性能的提升&#xff1a;工…

从VPS切换到云服务器的几大理由

有很多文章比较VPS和云服务器&#xff0c;选择哪种解决方案来提供最佳效率。尽管很多人仍在使用VPS&#xff0c;但其中许多人已对云服务器拥有简单的认知&#xff0c;且已有意图从VPS迁移到云服务器。然而在这样做之前&#xff0c;您需要更加深入了解云服务器&#xff0c;它的优…