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++模板类成员的声明和定义的更多相关文章

  1. C++11类内static成员变量声明与定义

    众所周知,将一个类内的某个成员变量声明为static型,可以使得该类实例化得到的对象实现对象间数据共享. 在C++中,通常将一个类的声明写在头文件中,将这个类的具体定义(实现)写在cpp源文件中. 因 ...

  2. C++模板类内友元(友元函数,友元类)声明的三种情况

    根据<C++ Primer>第三版16.4节的叙述,C++类模板友元分为以下几种情况 1.非模板友元类或友元函数. 书上给了一个例子: class Foo{     void bar(); ...

  3. 你好,C++(32) 类是对现实世界的抽象和描述 6.2.1 类的声明和定义

    6.2  类:当C++爱上面向对象 类这个概念是面向对象思想在C++中的具体体现:它既是封装的结果,同时也是继承和多态的载体.因此,要想学习C++中的面向对象程序设计,也就必须从“类”开始. 6.2. ...

  4. C++---类成员变量定义为引用

    摘要:类成员变量是可以定义为引用类型的,但是我们需要注意一下用法 note1:在类中定义引用变量, 必须要在初始化列表中初始化该成员变量(const 类型数据成员也必须在初始化列表中进行初始化) #i ...

  5. C++中的链表节点用模板类和用普通类来实现的区别

    C++中的链表节点通常情况下类型都是一致的.因此我们可以用模板来实现. #include <iostream> using namespace std; template<typen ...

  6. C++类模板和模板类

    C++ 中有一个重要特性,那就是模板类型.类似于Objective-C中的泛型.C++通过类模板来实现泛型支持. 1 基础的类模板 类模板,可以定义相同的操作,拥有不同数据类型的成员属性. 通常使用t ...

  7. 学艺不精而惭愧--论C++模板类的使用

    自己断断续续地使用C++也有一段时间了.有些时候产生了自满的情绪.觉得自己对C++的语言特性已经知道的几乎相同了,在语法方面没有什么难倒我的地方了,如今所要做的是依据实际问题编敲代码,问题的难点在于算 ...

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

    问题来源 今天看了orbslam2自带的第三方库DBoW2的TemplatedVocabulary.h文件,发现其中模板类的函数成员的定义与声明放在了同一个文件:同时发现,DBoW2的CMakeLis ...

  9. 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 ...

随机推荐

  1. Java学习(异常类)

    一.什么是异常: 异常就是在运行时产生的问题.通常用Exception描述. 在java中,把异常封装成了一个类,当出现问题时,就会创建异常类对象并抛出异常相关的信息(如详细信息,名称以及异常所处的位 ...

  2. 【LOJ】#2024. 「JLOI / SHOI2016」侦查守卫

    题解 童年的回忆! 想当初,这是我考的第一次省选,我当时初二,我什么都不会,然后看着这个东西,是不是能用我一个月前才会的求lca,光这个lca我就调了一个多小时= =,然后整场五个小时,我觉得其他题不 ...

  3. Python全栈开发之16、jquery

    一.查找元素 1.选择器 1.1 基本选择器      $("*")  $("#id")  $(".class")  $("ele ...

  4. 关于PyCharm database查看db.sqlites文件无内容的一种可能解决方法

    初学python,学到了scrapy爬虫数据入库,在网上跟着一个视频课进行学习,但是碰到了如下问题: 这里新建了数据库文件之后,将这个.sqlite文件拖动到Database里面,然后出现了上图描述问 ...

  5. BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡 广义后缀自动机 后缀自动机 字符串

    https://www.lydsy.com/JudgeOnline/problem.php?id=3926 广义后缀自动机是一种可以处理好多字符串的一种数据结构(不像后缀自动机只有处理一到两种的时候比 ...

  6. 【Floyd(并非水题orz)】BZOJ4093-[Usaco2013 Dec]Vacation Planning

    最近刷水太多标注一下防止它淹没在silver的水题中……我成为了本题,第一个T掉的人QAQ [题目大意] Bovinia设计了连接N (1 < = N < = 20,000)个农场的航班. ...

  7. bzoj 2460 拟阵+判线性相关

    /************************************************************** Problem: 2460 User: idy002 Language: ...

  8. oracle复杂查询是sql

    一.over()分析函数 分组查前几条:select * from test t where (select count(*) from test a where t.type=a.type and ...

  9. Codeforces Round #358 (Div. 2) A. Alyona and Numbers 水题

    A. Alyona and Numbers 题目连接: http://www.codeforces.com/contest/682/problem/A Description After finish ...

  10. Android 性能监控系列一(原理篇)

    欢迎关注微信公众号:BaronTalk,获取更多精彩好文! 一. 前言 性能问题是导致 App 用户流失的罪魁祸首之一,如果用户在使用我们 App 的时候遇到诸如页面卡顿.响应速度慢.发热严重.流量电 ...