模板类

关于C++为什么模板类中的模板函数只能写在头文件

旧街凉风 提交于 2020-03-01 20:19:32
最近写模板类发现只能将模板函数的定义放在h文件里才能完成编译器链接。对于喜欢声明与定义分开的笔者来说这么写很不习惯。 那究竟是什么原因造成模板函数不能放在cpp文件里定义呢?本文就围绕着这个问题进行探究。 从编码到运行 首先笔者想要探讨一下一个C++项目是如何从文本文件生成可执行文件的。 预编译 预编译是将预编译宏命令进行处理,如 #include , #define , #ifdef , #pragma 等。 编译 编译是将文本中的源码转换成计算机能直接处理的汇编语言。这里要注意的是C++采用的是 分离式编译 (各个的h、cpp文件的编译独立)。 c++开发中广泛使用声明和实现分开的开发形式,其编译过程是分离式编译,就是说各个cpp文件完全分开编译,然后生成各自的obj目标文件,最后通过连接器link生成一个可执行的exe文件。引用自: https://blog.csdn.net/uestclr/article/details/51372780 链接 编译中提到了C++采用的是分离是编译,例如如下代码: Test.h void test(); Test.cpp #include "Test.h" void test() { //todo } main.cpp #include "test.h" int main() { test(); return 0; } 到此为止

【笔记】模板类成员函数指针的使用

放肆的年华 提交于 2020-02-17 02:16:29
# include <stdio.h> # include <stdlib.h> # include <map> # define TRUE 1 # define FALSE 0 /// 单向链表队列模板类 template < typename T > class TMyQueue { public : TMyQueue ( ) { head_ = NULL ; tail_ = NULL ; max_size_ = 10 ; size_ = 0 ; } TMyQueue ( int max_size ) { head_ = NULL ; tail_ = NULL ; max_size_ = max_size ; size_ = 0 ; } ~ TMyQueue ( ) { while ( head_ != NULL ) { Node * tmp = head_ ; head_ = head_ - > next ; free ( tmp ) ; } tail_ = NULL ; printf ( "[~TMyQueue]head_ = %p, tail_ = %p\n" , head_ , tail_ ) ; } bool IsFull ( ) { return ( size_ == max_size_ ) ; } bool IsEmpty ( ) { return ( size_

35、标准模板类(STL)(一),综述、容器及其操作

风流意气都作罢 提交于 2020-02-04 14:16:01
C++的 STL 是一个功能强大的库,它是建立在模板机制上,能够满足用户对存储管理不同类型数据的通用容器和施加在这些容器上的通用算法的巨大需求,并且具有完全的可移植性。因此在寻求程序的解决方案时,应该首先在 STL 中寻求恰当的容器和算法。 STL 是一个通用性极高的编程工具,这种通用性不仅表现在可以使用通用的容器存储和管理任意类型的数据,更重要的是可以对不同的容器施加统一通用的算法和操作。实现这种通用性的关键思想就是:通过引进一个间接层对象对不同结构的数据容器进行统一的访问操作,从而简化了对容器的操作,使得实现操作的算法和函数通用化。这种思想是 STL 的设计原则之一,也是软件设计中一个重要设计思想。 在 STL 中对容器访问的简化和独立就是通过循环子实现的,循环子可以无须依据某种特定容器的数据结构而完成对容器元素的访问,从而使得数据的存储结构与施加于数据的操作相互独立。标准模板库 STL 是由容器类模板,用于访问这些容器的循环子类模板和可以通过循环子在这些容器上实现的各种算法类模板以及函数类模板组成的。STL 为这种标准算法和函数(包括用户定义的函数)借助循环子在容器上实现的应用建立了统一的规则。 容器:可容纳各种数据类型的数据结构。 迭代器:可依次存取容器中元素的东西,连接容器和算法 算法:用来操作容器中的元素的函数模板。例如,STL用sort(

C++的模板类:不能将定义与声明写在不同文件中

梦想与她 提交于 2020-02-03 12:08:19
问题来源 今天看了orbslam2自带的第三方库DBoW2的TemplatedVocabulary.h文件,发现其中模板类的函数成员的定义与声明放在了同一个文件;同时发现,DBoW2的CMakeLists.txt并没有把TemplatedVocabulary.h的实现放入到libDBoW2.so之中。 所以含TemplatedVocabulary.h的文件需要再手动链接TemplatedVocabulary.h需要的库。 既然如此,我就”自作聪明“,新建了TemplatedVocabulary.cpp文件,把TemplatedVocabulary.h的实现写在了其中,在CMakeLists.txt中把TemplatedVocabulary.cpp加入了库文件libDBoW2.so中,这样就不用再手动链接TemplatedVocabulary.h需要的库了。然而,在链接libDBoW2.so库的时候出现了错误!! 原因 模板类需要指定类型,指定不同的类型,函数成员实现就不一样;所以在编译的时候需要根据指定的类型来加载相应的函数实现,而不是链接没有指定类型的库文件模板函数。 来源: https://www.cnblogs.com/liuzhenbo/p/12254986.html

C++STL模板类vector

▼魔方 西西 提交于 2020-01-26 16:59:49
文章目录 一、定义 二、常用操作 三、代码实现 STL(Standard Template Library)是C++的标准模板库,竞赛中很多常用的数据结构、算法在STL中都有,熟练地掌握它们在很多题目中能极大地简化编程。 vector容器是一个模板类,能存放任何类型的对象。 vector:动态数组,从末尾能快速插入与删除,直接访问任何元素 一、定义 定义int型数组 (也可使char、double等类型) # include <iostream> # include <vector> using namespace std ; int main ( ) { vector < int > a ; //默认初始化,a为空 vector < int > b ( a ) ; //用a定义b vector < int > a ( 100 ) ; //a有100个值为0的元素 vector < int > a ( 100 , 6 ) ; //a有100个值为6的元素 } 定义string型数组 # include <iostream> # include <vector> using namespace std ; int main ( ) { vector < string > a ( 10 , "null" ) ; //10个值为null的元素; vector < string > vec

vs2010类文件添加版权版本作者信息

一个人想着一个人 提交于 2020-01-26 05:58:40
通过以下方式可以自定义CS类文件代码模板(以下为VS2010,VS2008类似): 1,打开VS的安装目录,例如 D:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\ItemTemplates\CSharp\Code\2052 2,打开文件 Class.zip,找到文件 Class.cs,在文件头部加上下面的内容: #region << 版 本 注 释 >> /* * ======================================================================== * Copyright(c) 2008-2011北京高阳金信信息技术有限公司, All Rights Reserved. * ======================================================================== * * 【当前类文件的功能】 * * * 作者:[中文姓名] 时间:$time$ * 文件名:$safeitemname$ * 版本:V1.0.0 * * 修改者: 时间: * 修改说明: * ======================================================================== */

VS2010类模板修改——添加版权、说明

99封情书 提交于 2020-01-20 18:28:53
最近在学习使用Memcache,就想着用C#代码写一个实现Cache与Memcache以及将来若是能融入Redis切换使用的程序集。。。不过刚开始写代码,强迫症又犯了,万一我现在写好了代码,但是过段时间要再看的话,我还能很快的看明白这些代码是要实现什么的吗?虽说我在每段代码前都要写注释,可是我还是喜欢一眼看明白我写的代码是做什么的(健忘症V期患者)。好了,不扯了,开搞。 步骤: 对IDE快捷方式右键-属性-打开文件位置,找到..\Microsoft Visual Studio 10.0\Common7\IDE文件夹下的..\ItemTemplates\CSharp\Code\2052文件夹, 再找到Class.zip压缩文件 , 直接双击打开Class.cs文件,就可以直接修改了 这是开头的注释代码: 1 // *********************************************************************** 2 // Copyright (c) $year$ $username$,All rights reserved. 3 // Project: 4 // Assembly:$rootnamespace$ 5 // Author:$username$ 6 // Created:$time$ 7 // Description: 8 //

学习笔记-模板引擎类

本小妞迷上赌 提交于 2020-01-07 15:59:03
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> <?php class TPL{ protected $viewDir='./view/'; protected $cacheDir='./cache/'; protected $lifeTime=3600; protected $vars=[]; public function __construct($viewDir=null,$cahceDir=null,$lifeTime=null){ if(!empty($viewDir)){ $this->checkDir($viewDir);//检测路径 $this->viewDir=$viewDir; } if(!empty($cahceDir)){ $this->checkDir($cahceDir);//检测路径 $this->cahceDir=$cacheDir; } if(!empty($lifeTime)){ $this->lifeTime=$lifeTime; } } protected function checkDir($filePath){//检测路径 if(!(file_exists($filePath) && is_dir($filePath) )){ mkdir($filePath); } if(!(is_readable(

C++模板类的声明与实现分离

▼魔方 西西 提交于 2019-12-31 21:33:51
1、我们在写类的时候一般通常将声明放到.h文件,函数实现放入.cpp,如下: //.h class Mystring { public : Mystring ( const char * str = "empty" ) ; Mystring ( const char * data , int len ) ; . . . . . . ~ Mystring ( ) ; int myReplace ( const char * from , const char * to ) ; int myappend ( const char * data ) ; . . . . . . private : char * m_data ; unsigned int m_len ; } ; //.cpp Mystring :: Mystring ( const char * str ) { . . . } Mystring :: Mystring ( const char * data , int len ) { . . . } . . . . . . 2、但是在写类模板是将声明放到.h文件,函数实现放入.cpp,链接器会报错(提示找不到实现)如下: //.h template < class T > class Stack { public : Stack ( int s = 10 ) ; ~

tp父类及模板继承

老子叫甜甜 提交于 2019-12-30 03:48:43
一、TP父类方法继承 session用法 用登录页面做例子 <?php namespace Home\Controller; use Think\Controller; class LoginController extends Controller{ public function login(){ //显示页面,实现登录 if ( empty ( $_POST )){ $this ->show(); } else { //处理登录逻辑 $uid = $_POST [ "uid" ]; $pwd = $_POST [ "pwd" ]; $db = D( "Users" ); $arr = $db ->find( $uid ); if ( $arr [ "pwd" ]== $pwd &&! empty ( $pwd )){ session( "uid" , $uid ); //启动session $url = U( "Index/index" ); //不同控制器下的方法要写控制器名 //不在不同模块下要加上模块名 $this ->success( "登录成功!" , $url ); } else { $this ->error( "登陆失败!" ); //默认跳转到上一个界面 } } } } 在以后做项目中有可能做好多页面都需要加session,为了减少代码量可以做个父类