• C++中模板类声明和实现能否分离?


    1.声明部分

    #pragma once
    
    
    template <typename T>
    class MyTemplate
    {
    public:
        T MyAdd(T a, T b);
     
    };

    2.实现部分

    #include "MyTemplate.h"
    
    
    using namespace std;
    template<typename T>
    T MyTemplate<T>::MyAdd(T a, T b)
    {
        return a + b;
    }
    
     

    3.使用

    #include "MyTemplate.h"
     
    int _tmain(int argc, _TCHAR* argv[])
    {
        MyTemplate<int> *  my = new MyTemplate<int>();
    
        int ret = my->MyAdd(1, 10);
    
         printf("ret :%d
    ", ret);
         
        return 0;
    }

    编译的时候出现错误:

    >templateTest.obj : error LNK2019: 无法解析的外部符号 "public: int __thiscall MyTemplate<int>::MyAdd(int,int)" (?MyAdd@?$MyTemplate@H@@QAEHHH@Z),该符号在函数 _wmain 中被引用
    1>C:UsersAdministratorDocumentsVisual Studio 2013Projects emplateTestDebug emplateTest.exe : fatal error LNK1120: 1 个无法解析的外部命令

    4.解决办法

    将main.cpp中的#include "MyTemplate.h" 修改为 #include "MyTemplate.cpp"

    5.总结

    a)C++中模板的声明和实现能分离,只是在主程序中#include的是相应的.cpp

    b)C++中模板的声明和实现最好不要分开,都写在.h文件,这是因为在多个cpp文件中引用模板参数时可能引起重复定义的编译错误
     

    一些有趣的小知识

    《C++ Template》第六章讲过这个问题
    组织模板代码有三种方式
    1.包含模型(常规写法 将实现写在头文件中)
    2.显式实例化(实现写在cpp文件中,使用template class语法进行显式实例化)
    3.分离模型(使用C++ export关键字声明导出)

    第三种方式理论最优,但是实际从C++标准提出之后主流编译器没有支持过,并且在最新的C++11标准中已经废除此特性,export关键字保留待用。
    那么实际上能够使用的实现分离也就只有显式实例化

    比较有意思的是,《C++ Template》书中作者建议代码为分离模型做准备,等待编译器支持之后替换,没想到最终这个特性被C++标准废弃了。
     

  • 相关阅读:
    占卜DIY
    飞行员兄弟
    给树染色
    国王游戏
    雷达设备
    畜栏预定
    防晒
    去雨系列论文笔记
    First day
    如何用fprintf写十六进制 并控制格式
  • 原文地址:https://www.cnblogs.com/sharecenter/p/14694190.html
Copyright © 2020-2023  润新知