C++模板类的声明与实现分离

▼魔方 西西 提交于 2019-12-31 21:33:51

1、我们在写类的时候一般通常将声明放到.h文件,函数实现放入.cpp,如下:

//.h
class Mystring{
public:
    Mystring(const char* str = "empty");
    Mystring(const char* data, int len);
    ...
    ...
    ~Mystring();
    
    int myReplace(const char* from, const char* to);
    int myappend(const char* data);
    ...
    ...

private:
    char* m_data;
    unsigned int m_len;
};

//.cpp
Mystring::Mystring(const char* str){
    ...
}

Mystring::Mystring(const char* data, int len){
    ...
}
...
...

2、但是在写类模板是将声明放到.h文件,函数实现放入.cpp,链接器会报错(提示找不到实现)如下:

//.h
template <class T> class Stack
{
public:
    Stack(int s = 10);
    ~Stack();

    void push(const T n);
    T pop()private:
    int m_size;
    int m_top;
    T* m_stackPtr;
};

//.cpp
template <class T> Stack<T>::Stack(int s){
...
}

template <class T> Stack<T>::~Stack(){
    ...
}
这样编译的话会有提示找不到或者未定义实现

解决办法:

1、将实现代码放入.tpp,在.h中包含此.tpp文件

2、使用显示声明来实现分离:在.cpp实现代码末尾加入显示声明要使用模板类的实例。eg:

template class TestTemplate<int>;
template class TestTemplate<float>;

注:以上例子只为了说明与论证此问题

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!