zoukankan      html  css  js  c++  java
  • C++中template的.h文件和.cpp文件的问题

    在C++中,用到类模板时,如果类似一般的类声明定义一样,把类声明放在.h文件中,而具体的函数定义放在.cpp文件中的话,会发现编译器会报错。如类似下面代码:

    //test.h文件
    #ifndef TEST_H_
    #define TEST_H_
    
    template <class T>
    class test
    {
    private:
        T a;
    public:
        test();
    };
    
    #endif
    //test.cpp文件
    #include "test.h"
    
    template <class T>
    test<T>::test()
    {
        a = 0;
    }
    //main.cpp文件
    #include <iostream>
    #include "test.h"
    using namespace std;
    
    int main()
    {
        test<int> abc;
    }

    以上代码在编译时会产生如下错误:

    Error    2    error LNK1120: 1 unresolved externals
    Error    1    error LNK2019: unresolved external symbol "public: __thiscall test<int>::test<int>(void)" (??0?$test@H@@QAE@XZ) referenced in function _main

    原因在于,类模版并不是真正的类,它只是告诉编译器一种生成类的方法,编译器在遇到类模版的实例化时,就会按照模版生成相应的类。

    在这里就是编译器遇到main函数中的test<int> abc;时就会去生成一个int类型的test类。

    而每一个cpp文件是独立编译的,那么如果将类模版的成员函数单独放在一个cpp文件中,编译器便无法确定要根据什么类型来产生相应的类,也就造成了错误。

    一般的解决方法就是将类模版中的成员函数定义也写入.h文件中。

  • 相关阅读:
    数据库的逻辑结构与物理结构
    HTTP笔记整理(1)
    当我看懂这张图的时候很痛苦~~~
    软件测试面试分享(转)
    达梦(DM)数据库Linux部署安装
    进阶的小小测试~软件测试不得不知的基础知识
    软件测试分类
    浅说软件需求分析
    浅说《测试用例》----给测试新手的
    软件测试人员两极分化
  • 原文地址:https://www.cnblogs.com/caiminfeng/p/4835855.html
Copyright © 2011-2022 走看看