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

之前的类模板成员函数都定义在类的内部,但是在实际开发中,往往需要将成员函数的实现放在类的外部,先看一个基础类:

 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 Complex& c);
 7 public:
 8     Complex(int a = 0, int b = 0)
 9     {
10         this->a = a;
11         this->b = b;
12     }
13     void printfCom()
14     {
15         cout << "a: " << a << " b: " << b << endl;
16     }
17 private:
18     int a;
19     int b;
20 };
21 Complex operator + (Complex &c1, Complex &c2)
22 {
23     Complex sum;
24     sum.a = c1.a + c2.a;
25     sum.b = c1.b + c2.b;
26     return sum;
27 }
28 ostream& operator<<(ostream &out, const Complex& c)
29 {
30     out << "a: " << c.a << " b: " << c.b << endl;
31     return out;
32 }
33 int main()
34 {
35     Complex c1(10,20);
36     Complex c2(20, 30);
37     Complex c3 = c1 + c2;
38     cout << c3 << endl;
39
40     cout << "hello...\n";
41     return 0;
42 }

然后把上面的代码改成类模板:

 1 #include<iostream>
 2 using namespace std;
 3
 4 template<typename T>
 5 class Complex {
 6     template<typename T>
 7     friend Complex<T> operator + (Complex<T> &c1, Complex<T> &c2);
 8     template<typename T>
 9     friend ostream& operator << (ostream &out, const Complex<T>& c);
10 public:
11     Complex(T a , T b )
12     {
13         this->a = a;
14         this->b = b;
15     }
16     Complex()
17     {
18         this->a = 0;
19         this->b = 0;
20     }
21     void printfCom()
22     {
23         cout << "a: " << a << " b: " << b << endl;
24     }
25 private:
26     T a;
27     T b;
28 };
29 template<typename T>
30 Complex<T> operator + (Complex<T> &c1, Complex<T> &c2)
31 {
32     Complex<T> sum;
33     sum.a = c1.a + c2.a;
34     sum.b = c1.b + c2.b;
35     return sum;
36 }
37 template<typename T>
38 ostream& operator<< (ostream &out, const Complex<T>& c)
39 {
40     out << "a: " << c.a << " b: " << c.b << endl;
41     return out;
42 }
43 int main()
44 {
45     Complex<int> c1(10,20);
46     Complex<int> c2(20, 30);
47     Complex<int> c3 = c1 + c2;
48     cout << c3 << endl;
49
50     cout << "hello...\n";
51     return 0;
52 }

这里的学问有很多,友元函数的模板分离有很多要考虑的东西。

时间: 2024-11-01 13:47:29

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

C++程序设计方法4:类模板

类模板 在定义类时也可以将一些类型抽象出来,用模板参数来替换,从而使类更具有通用性.这种类被称为模板类,例如: template <typename T> class A { T data; public: //类模板成员函数的定义方式一:在类模板中定义 void print() {cout << data << endl;} } //类模板成员函数的定义方式二:在类模板外定义 template<typename T> void A::print(){cou

c++类模板深度剖析

1.类模板的泛指类型可以定义多个 template <typename T1, typename T2> class Test { public: void add(T1 a, T2, b); }; 使用时: Test<int, float> t1; //T1的泛指类型就是int, T2的泛指类型就是float. 2.类模板的特化类型 (1)意思就是如果定义了一个类模板,这个类模板的参数有多个,但是如果当使用这个类模板的时候,我们传递参数时,参数的类型是一样的话,编译器就会将类模板

C++ Primer 学习笔记_80_模板与泛型编程 --类模板成员

模板与泛型编程 --类模板成员 引言: 这一节我们介绍怎样实现前面提到的Queue模板类. 标准库将queue实现为其他容器之上的适配器.为了强调在使用低级数据结构中设计的编程要点,我们将Queue实现为链表.实际上,在我们的实现中使用标准库可能是个更好的决定!!-_-. 1.Queue的实现策略 如图所示,我们实现两个类: 1)QueueItem类表示Queue的链表中的节点,该类有两个数据成员item和next: a. item保存Queue中元素的值,它的类型随Queue的每个实例而变化:

C++入门经典-例9.3-类模板,简单类模板

1:使用template关键字不但可以定义函数模板,而且可以定义类模板.类模板代表一族类,它是用来描述通用数据类型或处理方法的机制,它使类中的一些数据成员和成员函数的参数或返回值可以取任意数据类型.类模板可以说是用类生成类,减少了类的定义和数量. 2:类模板的一般定义形式如下: template <类型形式参数表> class 类模板名 { ...//类模板体 } 类模板成员函数的定义形式如下: template <类型形式参数表> 返回类型 类模板名 <类型名表>::

C++中的类模板详细讲述

一.类模板定义及实例化 1. 定义一个类模板: 1 template<class 模板参数表>2 3 class 类名{4 5 // 类定义......6 7 }: 其中,template 是声明类模板的关键字,表示声明一个模板,模板参数可以是一个,也可以是多个,可以是类型参数 ,也可以是非类型参数.类型参数由关键字class或typename及其后面的标识符构成.非类型参数由一个普通参数构成,代表模板定义中的一个常量. 例: 1 template<class type,int widt

类模板(四十八)

我们上节博客介绍了泛型编程思想,那么在 C++ 中是否可以将泛型的思想应用于类呢?答案肯定是显而易见的,在 C++ 中的标准库中,就是一些通用的类模板.我们先来看看类模板有哪些特性,它主要是用于存储和组织数据元素,类中数据组织的方式和数据元素的具体类型无关,如:数组类.链表类.Stack 类等.C++ 中将模板的思想应用于类,使得类的实现不关注数据元素的具体类型,而只关注类所需要实现的功能. 在 C++ 中的类模板是以相同的方式处理不同的类型,并且在类声明前使用 template 进行标识.<

C++ 使用类模板的static成员

使用类模板的static成员 定义下面这个模板类 template <class T> class Foo { public: static std::size_t ctr; static std::size_t count() { return ctr++; } static void set_ctr(std::size_t v) { ctr = v; } T val; }; 下面的代码来使用它 Foo<int> f1, f2; Foo<int>::set_ctr(1

C++解析(26):函数模板与类模板

0.目录 1.函数模板 1.1 函数模板与泛型编程 1.2 多参数函数模板 1.3 函数重载遇上函数模板 2.类模板 2.1 类模板 2.2 多参数类模板与特化 2.3 特化的深度分析 3.小结 1.函数模板 1.1 函数模板与泛型编程 C++中有几种交换变量的方法? 交换变量的方法--定义宏代码块 vs 定义函数: 定义宏代码块 优点:代码复用,适合所有的类型 缺点:编译器不知道宏的存在,缺少类型检查 定义函数 优点:真正的函数调用,编译器对类型进行检查 缺点:根据类型重复定义函数,无法代码复

C++ template学习二 类模板定义及实例化

一个类模板(也称为类属类或类生成类)允许用户为类定义一种模式,使得类中的某些数据成员.默写成员函数的参数.某些成员函数的返回值,能够取任意类型(包括系统预定义的和用户自定义的). 如果一个类中数据成员的数据类型不能确定,或者是某个成员函数的参数或返回值的类型不能确定,就必须将此类声明为模板,它的存在不是代表一个具体的.实际的类,而是代表着一类类. //templatedemo.h#ifndef TEMPLATE_DEMO_HXX#define TEMPLATE_DEMO_HXX template