1、背景:
写c++我们常常定义程序的功能将在撰写xxx.h在。写在功能的执行xxx.cpp, 但是,当我们用写模板函数和类,写将失败,如下面:
stack.h
//stack.h
#ifndef STACK_HPP
#define STACK_HPP
#include <vector>
#include <stdexcept>
template<typename T, typename TContainer = std::vector<T>>
class CStack
{
public:
void push(const T& vValue);
void pop();
T top() const;
bool empty() const {return m_Container.empty();}
private:
TContainer m_Container;
};
#endif
stack.cpp
#include "stack.h"
template<typename T, typename TContainer>
void CStack<T, TContainer>::push(const T& vValue)
{
m_Container.push_back(vValue);
}
template<typename T, typename TContainer>
void CStack<T, TContainer>::pop()
{
if (empty()) throw std::out_of_range("Stack::pop: empty stack\n");
m_Container.pop_back();
}
template<typename T, typename TContainer>
T CStack<T, TContainer>::top() const
{
if (empty()) throw std::out_of_range("Stack::top: empty Stack\n");
return m_Container.back();
}
然后在main函数中測试就会出错:
#include "stack.h"
int main()
{
stack<int> IntStack;
....
}
2、曾经总是没办法,仅仅能把定义和实现写在同一个文件里。今天最终找到一种解决方法
首先定义 stack.hpp。类的定义
#ifndef STACK_HPP
#define STACK_HPP
#include <vector>
#include <stdexcept>
template<typename T, typename TContainer = std::vector<T>>
class CStack
{
public:
void push(const T& vValue);
void pop();
T top() const;
bool empty() const {return m_Container.empty();}
private:
TContainer m_Container;
};
#endif
3、然后定义stackdef.hpp 来实现模版中定义的函数:
#ifndef STACKDEF_HPP
#define STACKDEF_HPP
#include "stack.hpp"
template<typename T, typename TContainer>
void CStack<T, TContainer>::push(const T& vValue)
{
m_Container.push_back(vValue);
}
template<typename T, typename TContainer>
void CStack<T, TContainer>::pop()
{
if (empty()) throw std::out_of_range("Stack::pop: empty stack\n");
m_Container.pop_back();
}
template<typename T, typename TContainer>
T CStack<T, TContainer>::top() const
{
if (empty()) throw std::out_of_range("Stack::top: empty Stack\n");
return m_Container.back();
}
#endif
4、最后測试:
#include "stack_def.hpp"
int main()
{
CStack<int> IntStack;
IntStack.push(1);
system("pause");
return 0;
}
5、这样即可了!
参考连接:https://www.cnblogs.com/yxwkf/p/4667606.html 。