C++模板类的编译问题

55nm工艺下DDR2与ONFI 3.2高速I/O电路设计实战 在存储接口设计中,工艺节点选择需平衡性能、成本与成熟度,55nm凭借低漏电、高速度及完善PDK成为DDR PHY的黄金节点。高速I/O电路作为混合信号设计核心,需解决信号完整性、时序裕量、功耗与ESD防护等挑战。通过电压模式发送器、自偏置接收器、半速率时钟架构及ZQ校准等关键技术,可在400MHz数据率下实现稳定可靠的DDR2-800与ONFI 3.2 NV-DDR2双协议兼容。这些方法广泛应用于存储桥接芯片、固态存储控制器等场景,为高速接口设计提供工程实践参考。 阅读详情

<转自“软件工匠笔记”:http://linhs.blog.51cto.com/,特别表示感谢,希望更多被C++模板所折磨的人能看到这篇文章,写得很清楚透彻>

 

一般发布C++类的方法是:使用.H文件写类定义,用CPP文件写实现。发布的时候可以把H文件和CPP编译出来的.O文件给客户程序,然后客户端程序来编译和链接类头文件和目标文件。
  虽然也可以发布CPP源文件,但发布.O文件可以更好的维护类的相对独立性,或者是源代码实现不方便让他人看到。
 
  例如,
 
  有类的头文件:
//Rec.h
#ifndef _REC_H_ 
#define _REC_H_ 
 
class Rec 
{ 
     
public: 
  Rec( int a); 
   void show(); 
private: 
     int m_a; 
}; 
 
 
#endif 
 
  类的实现文件。
 
//Rec.cpp
#include  "Rec.h" 
#include <iostream> 
using namespace std; 

Rec::Rec( int a) 
{ 
  m_a = a; 
} 

void Rec::show(){ 
  printf( "item=%d/n",m_a); 
} 
 
  使用类的时候,首先 g++ -c Rec.cpp 生成Rec.o备用。
 
  编写测试程序
 
//test.cpp
#include  "Rec.h" 

void main() 
{ 
  Rec a(10); 
  a.show(); 
}
 
  编译测试程序, g++ -o test test.cpp Rec.o
 
  运行得: item=10
 
  如果把Rec类变成模板类,那么编译的方法就不能如此优雅了。
 
  Rect类头文件
 
//Rect.h 
#ifndef _RECT_H_ 
#define _RECT_H_ 

template < class T> 
class RecT{ 
public: 
  RecT(T t); 
   void show(); 
private: 
  T m_a; 
}; 

#endif  //! #ifndef _RECT_H_
 
 
  Rect类实现文件:
 
#Rect.cpp
#include  "RecT.h" 
#include <iostream> 
using namespace std; 

template < class T> 
RecT<T>::RecT(T t) 
{ 
  m_a = t; 
} 

template < class T> 
void RecT<T>::show(){ 
  cout<< "item="<<m_a<<endl; 
}
 
 
  测试程序:使用模板类,T用int代替
 
#include  "RecT.h" 

void main() 
{ 
  RecT< int> a(10); 
  a.show(); 
}
 
  在VS6下,编译出现错误:
 
Compiling... 
Test.cpp 
Linking... 
Test.obj : error LNK2001: unresolved external symbol  "public: void __thiscall RecT<int>::show(void)" (?show@?$RecT@H@@QAEXXZ) 
Test.obj : error LNK2001: unresolved external symbol  "public: __thiscall RecT<int>::RecT<int>(int)" (??0?$RecT@H@@QAE@H@Z) 
Debug/TemplateTest.exe : fatal error LNK1120: 2 unresolved externals 
Error executing link.exe. 
 
  错误分析:
   Test.cpp 在编译目标文件是成功的,在链接的时候出现了错误。找不到RecT<int>类的方法。 
   事实上,Rect.cpp无法独立生成目标文件。理由很简单:因为其中的T类型在使用前还未知类型,如何分配内存还无法确定,自然就无法生成目标文件了。
  所以,编译模板类不能分两步走。模板类的实现文件需要和使用类的程序一起编译,编译器知道程序需要使用何种类后才可以编译出相应的类来。
 
  改改测试程序
 
#include  "RecT.cpp" 

void main() 
{ 
  RecT< int> a(10); 
  a.show(); 
}
 
 编译通过并成功运行

C++头文件:注意模板类在头文件中的使用 & C++20的模块 C++模板类在编译时会针对不同参数类型展开生成独立代码,导致编译后文件体积显著增加。本文通过实验展示,每增加一种vector实例化类型(如int、string、double),程序大小几乎翻倍。这是因为编译器会为每个模板实例生成完整代码,在多cpp文件中重复实例化会加剧编译负担。文章建议使用C++20模块功能,将模板定义封装在模块中(如myvector.cppm),通过导入(import)方式复用,避免重复展开,从而提升编译效率。这种方法特别适用于大型项目,能有效减少编译时间和最终二进制体积。 阅读详情

相关推荐

SpringBoot与Flowable整合:构建高效审批工作流的实战指南

本文是一份SpringBoot与Flowable整合构建高效审批工作流的实战指南。通过一个经典的二级审批场景,详细介绍了从项目搭建、BPMN流程设计、核心服务编写到RESTful API构建的完整步骤。文章深入探讨了如何利用Flowable工作流引擎实现审批流程的自动化驱动与灵活管理,并分享了变量管理、监听器、异步执行等进阶技巧与常见避坑指南,帮助开发者快速构建健壮、可维护的企业级审批系统。

qsc9012345的博客 519

[ C++ ] template 模板进阶 (特化,分离编译)

本篇内容包括C++ 非典型模板参数,类模板的特化,模板的分离编译。

优快云博客 2221

OpenRadar Matlab版:毫米波雷达信号处理全流程开源库详解

毫米波雷达数据解析与信号处理是感知领域的基础能力。本文介绍毫米波雷达从ADC原始采样到距离-多普勒(Range-Doppler)热图、CFAR检测、DOA估计直至点云与生命体征参数提取的完整处理链路,并深入讲解OpenRadar(Matlab版)开源库的内核设计、核心API与实测经验。从原理上看,距离FFT与多普勒FFT构成RD谱,CFAR自适应阈值实现目标检测,相位解缠与滤波用于呼吸心跳提取。技术价值在于将繁琐的雷达数据读取、矩阵变换和算法流程标准化,免去重复造轮子。可应用于人员存在感知、生命体征监护、4

weixin_33806859的博客 322

C++ 中Template 类、函数的编译过程

将博客搬至优快云

xianxjm的博客 2584

学习STM32的无人机控制

下面是一个基于STM32的无人机控制的简单示例代码,包括四旋翼的PID控制、遥控器信号解析和电机控制。本示例以STM32F103系列为例,使用Keil C编译器进行开发。

qq_67153941的博客 706

Buck电路中自举电容串联小电阻的作用

在Buck电路中,自举电容(Cboot)驱动高边MOSFET时,因寄生电感和电容会形成LC谐振回路,导致SW节点高频振铃,引发EMI问题。串联小电阻(Rboot)可引入阻尼效应,抑制振铃、改善波形和EMI性能,但会略微增加开关损耗。设计时建议预留可调电阻位(2Ω~20Ω),根据实测结果平衡效率与系统稳定性,提升电源可靠性。这一措施是优化开关电源EMC的常见实践。

硬核科技 626

C++ 函数模板在多文件编译中的问题

函数一般定义于头文件.h,实现于cpp;但是如果函数模板也定义与实现分离,就会报错。 模板定义很特殊。由template<…> 处理的任何东西都意味着编译器在当时不为它分配存储空间,它一直处于等待状态直到被一个模板实例告知。在编译器和连接器的某一处,有一机制能去掉指定模板的多重定义。所以为了容易使用,几乎总是在头文件中放置全部的模板声明和定义。 可以在实现所在cpp文件中添加实例化声明: 头文件 template<typename T> __global__ void func1

weixin_42764932的博客 975

MTK AWB 色温曲线的进一步猜想

平均距离来判断是否对该色温下白平衡进行全部收白处理,还是保留一些光源的本身的颜色。比如占据图像一大半左右的纯色背景,纵坐标值相对横坐标的距离应该会比较大,大于一般场景下的正常白点分布。反之,位于Plank_curve下方位置的点具有偏洋红色的倾向。此时拟合各个色温下的白点,拟合曲线大致是以X= 0.85)平行于横轴的一条直线。对原始坐标系中的点取对数后的Log坐标系空间。此时拟合各个色温下的白点,拟合曲线大致呈现的是一条直线。,可以认为是各种色温下白点分布所呈现的走向。的算法利用某个色温点的偏离。

大熊 722

windows C++代码移植linux平台 的一些坑

问题一:<thread>库 多线程在linux下面,报错“undefined reference to `pthread_create”。但是在windows平台上编译是没有问题。这里linux上的gcc编译器会把模板的尖括号“<” 识别成 “小于号”在windows下编译是没有问题的。linux下使用cmake,make 编译代码。问题二:模板类继承模板父类,无法在子类中访问到父类的成员变量。使用类的模板成员函数时,报一些奇怪的错误, 比如。插入 template 关键字。在cmake最后两段加上。

qq_38454181的博客 711

python实现马丁策略(股市) (附完整源码)

python实现马丁策略(股市) (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 603

黑猫带你学eMMC协议第9篇:eMMC初始化过程(initial)

本文依据eMMC JEDEC5.1及个人工作经验整理而成,如有错误请留言。 文章为个人辛苦整理,付费内容,禁止私自转载。 文章所在专栏:《黑猫带你学:eMMC协议详解》 1 什么是emmc的初始化 对于小白来说,可能不太明白什么是emmc初始化。举个栗子:当你拿到一个电脑,接上电源,是不是就立马可以用了呢?并不是吧,你还需要去开机,等待电脑启动,配置完各种参数,等出现了电脑桌面,你才能用。那么同样,对于emmc芯片来说,也不是提供电源就能用了,需要输入各种命令后,让其进入到tran state后,才能正.

黑猫奥利奥的博客 6741

C++模板的编译问题

对于模板,包括模板类与模板函数,它们的代码其实并不是直接翻译成二进制代码,它要求有一个“具体化”的过程,举个例子: template void FunA(T t) { } int main() { FunA(10); // call FunA(int) 编译器在这里决定给FunA一个FunA(int)的具体实现体。 }     也就是说,如果在main函数中,没有调

永远即等待的专栏 2245

国密SSL通信的调试技巧

前面写了几篇国密开发相关的文章:解读国密非对称加密算法SM2啥?双证书?详解国密SM2的加密和解密详解国密SSL ECC_SM4_SM3套件详解国密SM2的数字签名这篇文章来聊一聊国密S...

云水木石 3206

c++模板类的使用,编译的问题

1,模板类编译的问题 前两天在写代码时,把模板类的声明和分开放在两个文件中了,类似于下面这样: stack.hpp: #ifndef _STACK_HPP #define _STACK_HPP template <typename Type> class stack { public: stack(); ~stack(); }...

qq_37869098的博客 539

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C++中的模板类分离编译问题及解决方案

在一些较大的c++文件中,我们习惯上将类的定义,函数的定义,宏等等东西放在.h文件中,而他们的的具体实现工程放在.cpp文件中。如下图: 但是在实现模板类的过程中,使用这样的方式就会出现很多不必要的问题。 ...

weixin_43886592的博客 2982

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【C++】模板类出现链接错误“undefined reference to”!为什么 C++ 编译器对模板的分离式编译支持很弱??

为什么C++类模板无法分离编译?如何实现分离编译?

qq_45060471的博客 3463

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【cpp 问题解决】有关模板类编译出错:undefined reference to `Alist<int>::Alist(int)‘

问题:借助 Makefile 文件编译 main.cpp、alist.h 和 alist.cpp 文件时,报错: g++ -c -s -Wall -O -DUNIX -o main.o main.cpp g++ -c -s -Wall -O -DUNIX -o alist.o alist.cpp g++ -o main main.o alist.o main.o:main.cpp:(.text+0xba): undefined reference to `Alist<int>::Alist(in

isanth 1370

C++模板类编译问题记录

定义一些通用的静态模板函数,比如最值。

SuperYu的博客 528

[C++]模板类的声明与实现分离问题

本文,记录C++模板类的实现。 目的:实现一个bag类 做法:模板类bag的声明与实现分离,也就是.cpp和.h文件分离 此时,编译失败。 将.cpp和.h取消(亦即取消声明与实现的分离) 此时,编译成功,运行正常。 马上查找资料,收集整理如下: C++ 中的模板类声明头文件和实现文件分离后,如何能实现正常编译? ,链接Splitting temp

浪风一骑 5426

C++模板类编译问题

项目时,将线程池的模板类的声明写在。由于时间关系,错误原因稍后补充。

qq_43332536的博客 506

codeblocks如何建同一source下cpp_模板类在.h中定义,在.cpp中实现

原文出处:https://www.codeproject.com/Articles/48575/How-to-Define-a-Template-Class-in-a-h-File-and-Imp​www.codeproject.comc++中常见的过程是将类定义放在一个c++头文件中,将实现放在一个c++源文件中。然后,源文件成为项目的一部分,这意味着它是单独编译的。但是当我们为模板类实现这个过...

weixin_39553156的博客 329

C++模板类的问题 map::iterator 编译报错的问题

map::iterator k;在vs 2010 下编译通过,但在 linux下编译报错: expected ‘;’before “k”参考:http://www.vimer.cn/2010/01/%E5%85%B3%E4%BA%8Emapvector%E4%B8%AD%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E4%BD%BF%E7%94%A8%E6%A8%A1%E6%9D%BF%E7%9A%84%E9%97%AE%E9%A2%98.htmlhttp://wenwen.sos

vanwaals的专栏 2860

有关模板类不能使用g++编译的问题

有关模板类不能使用g++编译的问题 问题描述 今天在学习数据结构的时候,写一个矩阵类,使用到了模板,但是在编译的时候出现了如下错误。 /tmp/ccyX8J1m.o: In function `main': test.cpp:(.text+0x31): undefined reference to `matrix<int>::matrix(int, int)' collect2: error: ld returned 1 exit status makefile:3: recipe for

yujiajun13的博客 654

C++模板类(方法)分离编译问题

模板类(函数)的分离编译(Separate compile)问题          模板是一把双刃剑,Template的出现极大的简化了代码的重复,同时也增加了阅读代码的难度。很多复杂的Template 类是令人望而生畏的,再加上宏定义,可以直接进入梦魇。相信很多人仍对STL和MicroSoft的COM模板类深深的恐惧^_^。          闲话稍叙言归正传,Visual Studio

YahooLucas的专栏 1030
上一篇: C++类 使用template 如何封装为DLL
tinystone
博客等级 码龄19年 1粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值