C++模板分离

在正常情况下,c++模板是不允许在头文件声明,在cpp文件中实现。那是因为在cpp文件在编译时内存必须要给它分配储存空间。但是模板本身是一种泛型,在没有明确定义声明类型前,编译器也无法知道它的大小。所以就会出现链接失败。

//print.h
#ifndef _PRINT_
#define _PRINT_

template<typename T>
void print(T obj);
#endif
//print.cpp
#include "print.h"
#include <iostream>
using namespace  std;

template<typename T>
void print(T obj)
{
    cout<<obj;
}
//main.cpp
#include"print.h"
int main()
{
    print(100);
    while(1);
    return 0;
}

如果这样子编译的话,就会提示:

1>LINK : E:\mycode\模板\Debug\模板分离.exe not found or not built by the last incremental link; performing full link
1>main.obj : error LNK2019: unresolved external symbol "void __cdecl print<int>(int)" ([email protected]@@[email protected]) referenced in function _main
1>E:\mycode\模板\Debug\模板分离.exe : fatal error LNK1120: 1 unresolved externals

常用的解决方法一共有2种:

1是将定义也在头文件中,这种就不用说了。由于不在cpp文件中定义编译器也没有必要一开始分配内存,也就不会报错。

2采用显式的实例化声明,刚才我说过,定义在cpp文件中的模板函数由于没有确定的类型,导致编译器无法分配内存。这时候只要给以确定的类型,也就是显式的实例化声明就可以了,只需要在头文件中用确定的类型再声明一次即可。

//print.h
#ifndef _PRINT_
#define _PRINT_

template<typename T>
void print(T obj);

template void print<int>(int);
#endif

这样在编译就能通过了。

时间: 2024-08-24 13:36:36

C++模板分离的相关文章

【C++】C++问题——类模板分离编译、函数对象、智能指针

C++类模板的分离编译 过去很多类模板都是整个类连同实现都放在一个头文件里,像STL库就是遵循这样的策略来实现类模板的.现在的标准正试图矫正这种局面. 在实现中又许多函数模板.这意味着每个函数都必须包含模板声明,并且在使用作用域操作符的时候,类的名称必须通过模板变量来实例化. 比如一个operator=的代码: template <typename Object> const MemoryCell <Object> & MemoryCell<Object>::o

joomla T3框架中模板分离与自定义(local文件夹 实战研究)

1.重写布局配置(kjxxzx-corporate-home.ini) 模板商purity_iii提供的布局配置文件的路径:/templates/purity_iii/etc/layouts 自定义布局时,用户布局配置文件应放在:/templates/purity_iii/local/etc/layouts 2. 重写布局文件(kjxxzx-corporate-home.php) 模板商提供的布局文件的路径:/templates/purity_iii/tpls 如果用户想重写布局文件或区块文件,

joomla T3框架中模板分离与自定义(local文件夹)

问题:辛苦做的模板,在框架升级后,莫名其妙的就不见了?原因是,在原有默认的模板修改内容,升级到新版本时,修改的内容被新内容覆盖更新掉了. 1. 怎么办? 模板内容被覆盖的问题,可以通过将用户的设置.模板与默认模板分离出来,具体方法如下: 在模板中,有个特殊的文件夹"local",将用户所有的布局配置信息.布局文件放到这个文件夹中. 2.文件的优先级 local文件夹:/templates/{template-name}/local template文件夹:/templates/{tem

gcc 关于模板函数或者模板类的问题

我把模板的声明写在X.h的文件里,把实现写在X.cpp的文件里 然后编译不通过,然人很恼火的是,根本不知道啥原因 在某网站上看到了一句 “又是一个模板分离编译的受害者” 立马就改正了,于是把两个文件写在了一起 没错了 然后搜了一下“模板分离” 有人说这是个传说 有人说这是真的 我也不深究这是啥了 听人讲这是老版本的编译器的错误 可现在都是2014年了啊 2014年11月25日20:21:59

Ef+T4模板实现代码快速生成器

转载请注明地址:http://www.cnblogs.com/cainiaodage/p/4953601.html 效果如图,demo抛砖引玉,还望大家不吝赐教.(点击demo下载案例) 项目结构如图 T4BLL添加BLL.tt文件: T4Model添加Model文件: T4DAL添加DAL.tt文件: T4DAL 添加ADO.NET Entity Data Model选择dababase first 模式: 打开Model1.edmx文件下的Model1.tt打开,复制内容替换了T4Model

类模板的实现与定义相分离

之前的类模板成员函数都定义在类的内部,但是在实际开发中,往往需要将成员函数的实现放在类的外部,先看一个基础类: 1 #include<iostream> 2 using namespace std; 3 4 class Complex { 5 friend Complex operator + (Complex &c1, Complex &c2); 6 friend ostream& operator<<(ostream &out, const Co

arm64-v8a 静态成员模板 undefined reference to

谷歌发布新包需要64位的so Application.mk 中 APP_ABI := armeabi armeabi-v7a x86 x86_64 arm64-v8a 添加了 arm64-v8a 和 x86_64 两个平台. 之前项目中使用了模板 在 .h 文件中定义了 数据,.cpp 中实现了具体的功能.但是 上述新添加的平台编译不过. 后经查找, 有可能是 因为模板分离编译导致函数无法展开. 在 .h 下面 #include cpp 文件, 解决一部分. 后又出现模板多重定义问题, 是因为s

XSLFormatter应对大部头出版物的排版软件

随着出版物电子排版方式的普及,大部头出版物的排版,越来越多的应用在人们的工作中.例如,惠普公司的打印机销往世界各地几百个国家,打印机使用手册至少需要出版100多种语言,印出的手册摞起来有1人多高.另外,波音飞机和大众汽车等公司的产品装配手册和使用手册也都是如此,都是上千页甚至是上万页的大数据排版.对于这种大部头出版物的排版,传统的方法非常繁琐且容易出错. XSLFormatter是红樱枫软件有限公司开发的一款对XML和XSL进行排版的功能强大的软件,这种方法就是将出版物的数据放在XML文件中,而

利用freemarker 静态化网页

1.介绍-FreeMarker是什么 模板引擎:一种基于模板的.用来生成输出文本的通用工具 基于Java的开发包和类库 2.介绍-FreeMarker能做什么 MVC框架中的View层组件 Html页面静态化 代码生成工具 CMS模板引擎 页面栏目动态定制 3.介绍-为什么要用FreeMarker 程序逻辑(Java 程序)和页面设计(FreeMarker模板)分离 分层清晰,利于分工合作 主流Web框架良好的集成(struts2,springmvc) 简单易学.功能强大 免费开源 4.Free