只说包含模型吧。高大上的分离模型,编译器支持不好,虽然是标准中明文规定的。详见:http://blog.csdn.net/hikaliv/article/details/4474835
形式1
文件组织形式如下:
现在假设共有3个文件,friend.cpp实现模板函数定义;friend.h实现模板函数声明;main.c实现函数调用。
// friend.cpp文件
// 注意这里没有头文件包含
template<class T> int compare(const T &v1, const T &v2)
{
if (v1 < v2) return -1;
if (v1 > v2) return 1;
return 0;
}
// friend.h文件
#pragma once
using namespace std;
template <class T> int compare(const T&, const T&);
#include "friend.cpp" //注意包含的位置
// main.cpp
#include "friend.h"
int main()
{
cout << compare(-3, 9) << endl;
system("pause");
return 0;
}
形式2
形式2其实是形式1的变种,但是更加明智。它将模板函数或者类模板的成员函数的实现放在头文件中进行。
以Stack类模板为例,共有3个文件:
- Stack.h,实现类模板的定义体
- StackDef.h实现类模板的成员函数,事实上也是定义模板函数;
- 主函数,使用类模板
// Stack.h文件
#pragma once
#include <iostream>
#include <vector>
#include <stdexcept>
using namespace std;
//声明类模板
template <class T>
class Stack
{
private:
vector<T> elems; //数据成员
public:
Stack(); //构造函数
Stack(vector<T>& t_vec); //构造函数
void push(T const& t);//压入元素
void pop(); //弹出元素,删除栈顶元素
T top()const; //返回栈顶元素
};
//StackDef.h文件
#include "Stack.h"
// template Stack<T>的成员函数
template<class T> Stack<T>::Stack()
{
vector<T> temp_vactor;
elems = temp_vactor;
}
template<class T> Stack<T>::Stack(vector<T>& t_vec)
{
elems(t_vec);
}
template <class T> void Stack<T>::push(T const& t)
{
elems.push_back(t);
return;
}
template <class T> void Stack<T>::pop()
{
if (elems.empty())
{
return;
}
else
{
elems.pop_back();
}
}
template <class T> T Stack<T>::top() const
{
if (elems.empty())
{
throw out_of_range("Stack::top(); empty Stack");
}
return elems.back(); //vector的末端就是堆栈的顶端
}
//main.c文件
#include "StackDef.h"
int main()
{
cout << "I am here!" << endl;
Stack<int> intStack;
intStack.push(7);
cout << intStack.top() << endl;
intStack.pop();
system("pause");
return 0;
}