When writing C ++ programs, we often write the function definition in XXX. h, write the function implementation in XXX. CPP, but when we write functions and classes with templates
The following error occurs:
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();}
Then an error occurs during the test of the main function:
#include "stack.h"int main(){ stack<int> IntStack; ....}
In the past, there was always no way to write definitions and implementations in the same file. Today, we finally found a solution.
First, define stack. HPP and class.
#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
Then define stackdef. HPP to implement the functions defined in the template.
#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
Final Test
#include "stack_def.hpp"int main(){CStack<int> IntStack;IntStack.push(1);system("pause");return 0;}
That's all!