c++模板类成员的声明和定义
c++模板类成员的声明和定义应该都放在*.h中,有普通类不一样。
如果定义放在*.cpp中,最终链接时,会报方法undefined错误。
参考:http://users.cis.fiu.edu/~weiss/Deltoid/vcstl/templates
如果非要定义在*.cpp中,一定要具体化模板类型,如下,但这样意味着你要定义无数个。
所以还是放在*.h中吧,用到的地方,编译器会帮你定义具体类型的方法。
// error
template<typename T>
A<T>::func() {
// ...
} // OK
template<>
A<int>::func() {
// ...
}
一个例子:
// template.h
#include <iostream>
#ifndef __TEMPLATE_H_
#define __TEMPLATE_H_ class ContextAbstr {
public:
virtual void log() = ;
}; template<typename T>
class Sam {
public:
Sam() {}
virtual ~Sam() {} void func() {
_context.log();
return;
} public:
static int snumber;
static void sfunc(); private:
T _context;
}; // template class's method must be define in *.h
// so when be called, different T expand to different definetion
// otherwise, ld cann't find the method
template<typename T>
void Sam<T>::sfunc() {
std::cout << "hello template static func" << std::endl;
} // regular class's method be declared in *.h, and defined in *.cpp
// otherwise, result to mutli-definetion error
class Context : public ContextAbstr {
public:
void log();
}; #endif //__TEMPLATE_H_
// template.cpp
#include "template.h" // template class's member also can be defined in *.cpp, but must specilize the T
template<>
int Sam<int>::snumber = ; template<>
int Sam<float>::snumber = ; // regular class's method be defined in *.cpp, avoid mutli-definetion
void Context::log() {
std::cout << "hello world from template class" << std::endl;
}
// test_template.cpp
#include "template.h" int main()
{
Sam<Context>::sfunc(); Sam<Context>* sam = new Sam<Context>();
sam->func(); Sam<int>* sam_int = new Sam<int>();
std::cout << "int's snumber: " << sam_int->snumber << std::endl; Sam<float>* sam_float = new Sam<float>();
std::cout << "float's snumber: " << sam_float->snumber << std::endl; return ;
}
c++模板类成员的声明和定义的更多相关文章
- C++11类内static成员变量声明与定义
众所周知,将一个类内的某个成员变量声明为static型,可以使得该类实例化得到的对象实现对象间数据共享. 在C++中,通常将一个类的声明写在头文件中,将这个类的具体定义(实现)写在cpp源文件中. 因 ...
- C++模板类内友元(友元函数,友元类)声明的三种情况
根据<C++ Primer>第三版16.4节的叙述,C++类模板友元分为以下几种情况 1.非模板友元类或友元函数. 书上给了一个例子: class Foo{ void bar(); ...
- 你好,C++(32) 类是对现实世界的抽象和描述 6.2.1 类的声明和定义
6.2 类:当C++爱上面向对象 类这个概念是面向对象思想在C++中的具体体现:它既是封装的结果,同时也是继承和多态的载体.因此,要想学习C++中的面向对象程序设计,也就必须从“类”开始. 6.2. ...
- C++---类成员变量定义为引用
摘要:类成员变量是可以定义为引用类型的,但是我们需要注意一下用法 note1:在类中定义引用变量, 必须要在初始化列表中初始化该成员变量(const 类型数据成员也必须在初始化列表中进行初始化) #i ...
- C++中的链表节点用模板类和用普通类来实现的区别
C++中的链表节点通常情况下类型都是一致的.因此我们可以用模板来实现. #include <iostream> using namespace std; template<typen ...
- C++类模板和模板类
C++ 中有一个重要特性,那就是模板类型.类似于Objective-C中的泛型.C++通过类模板来实现泛型支持. 1 基础的类模板 类模板,可以定义相同的操作,拥有不同数据类型的成员属性. 通常使用t ...
- 学艺不精而惭愧--论C++模板类的使用
自己断断续续地使用C++也有一段时间了.有些时候产生了自满的情绪.觉得自己对C++的语言特性已经知道的几乎相同了,在语法方面没有什么难倒我的地方了,如今所要做的是依据实际问题编敲代码,问题的难点在于算 ...
- C++的模板类:不能将定义与声明写在不同文件中
问题来源 今天看了orbslam2自带的第三方库DBoW2的TemplatedVocabulary.h文件,发现其中模板类的函数成员的定义与声明放在了同一个文件:同时发现,DBoW2的CMakeLis ...
- About The Order of The Declarations And Definition When Making a Member Function a Friend.关于使类成员成为另一个类友元函数的声明顺序和定义。
If only member function clear of WindowMgr is a friend of Screen, there are some points need to note ...
随机推荐
- Drawable子类之——StateListDrawable (选择器)
Drawable子类之——StateListDrawable (选择器) https://www.jianshu.com/p/7257ce82c762 本文出自 “阿敏其人” 简书博客,转载或引用请注 ...
- 转:40个Java集合面试问题和答案
转自牛客网:http://mp.weixin.qq.com/s?__biz=MjM5NDYxMzk1Nw==&mid=215319390&idx=1&sn=1ab621bc40 ...
- HBase(三)HBase架构与工作原理
一.系统架构 注意:应该是每一个 RegionServer 就只有一个 HLog,而不是一个 Region 有一个 HLog. 从HBase的架构图上可以看出,HBase中的组件包括Client.Zo ...
- 1975: [Sdoi2010]魔法猪学院
k短路,只会写A*的飘过..priority_queue超空间差评!
- python使用cookie登陆网页
python2: Python 爬虫入门六之 Cookie 的使用 python3: Python3 网络爬虫 (六):Python3 使用 Cookie - 模拟登陆获取妹子联系方式 python ...
- mongodb导入导出
导出 mongoexport -d 数据库 -c 表名 -o 输出文件名 例:mongoexport -d Mongodb_DataManager -c Kujiale_Users -o Kujial ...
- 两种方法设置nginx并发限制下面的白名单策略
前言: 今天,公司主站突然出现IDE创建应用没反应的问题,经过预发布环境.非代理环境下面的服务测试,均没有问题,定位问题出现在前端.而我们前端有两层代理,一是青松抗D系统,一是我们自己的nginx代理 ...
- Dubbo中只订阅与只注册
一:只订阅 1.场景 为方便开发测试,经常会在线下共用一个所有服务可用的注册中心,这时,如果一个正在开发中的服务提供者注册,可能会影响消费者不能正常运行. 可以让服务提供者开发方,只订阅服务(开发的服 ...
- 004 爬虫(最初的爬虫方式,以及urllib2)
一:最初的爬取方式 1.代码示例 # coding=utf-8 import urllib2 request=urllib2.Request("http://www.baidu.com&qu ...
- tensorflow初始化参数内存占满问题
最近使用tensorflow构建了一个浅层的网络,初始化参数的时候发现两个1080ti 22G的显存马上占满 后来发现解决办法为:在创建session的时候把显存设置为自适应即可,如下 config ...