zoukankan      html  css  js  c++  java
  • C++ 不支持模版的分离式编译

    1、C++不支持模版的分离式编译,为什么?

      C++是分别,单独编译,对于每个cpp文件,预编译为编译单元,这个编译单元是自包含文件,编译的时候,不需要其他的文件,编译好了,生成obj文件,然后连接成exe文件。在编译的时候,使用一个东西,如果这个东西就在当前位置,当然好了。如果不再当前位置,也没关系,只要说,我有这个东西就行,这个东西在其他地方。在连接的时候,会找到这个东西在什么地方。

      考虑普通方法,通过上面的分析,是没有问题的。考虑模版方法:

      Fun.h声明一个方法模版,Fun.cpp包含Fun.h,并定义了方法模版,main.cpp包含Fun.h,然后使用方法。单独编译Fun.cpp,并不会生成特定版本的方法,因为C++规定,模版只有在使用的时候,才实例化一个方法(C++也做不到,因为有太多的类型,难道针对每个类型都实例化一个方法,显然不可能)。在main.cpp中,相当于声明了模版方法,但是不知道模版方法的定义,因此也没法实例化模版方法,只能希望连接器在其他的obj文件中,找到对应的实例化方法。但是在连接的时候,找不到对应的方法,连接错误。

    2、上面问题的关键是:C++单独,分别编译。Fun.cpp定义了模版方法,但是没有使用,因此不会实例化模版方法。而在main.cpp中,使用了模版方法,但是不知道模版方法的定义,也没办法实例化方法,只能寄希望于连接的时候,从其他obj中找到,当然找不到,就出错了。

      解决的办法就是:把模版方法的定义也放到头文件中。包含这个头文件,并且使用模版方法,都会实例化一个对应的方法。这就会导致一个问题:不同的obj文件之间,会重复实例化模版方法。这个没关系,可以认为,连接的时候,只保留一个。

  • 相关阅读:
    Oracle一次可以查询多个表的结果的方法
    nagios+logstash实时监控java日志(一)
    原 ELK+Filebeat集中式日志解决方案(centos7)
    关于系统运维监控规范的几点建议和思考
    web文件管理系统和日志实时监控工具
    [运维]ELK实现日志监控告警
    阿里云服务器 发送邮箱 STMP 25端口 465端口问题 Javamail 25被禁用
    Elasticsearch5.6搭建及拼音中文混合搜索实现
    ELK pipeline
    图解Elasticsearch中的_source、_all、store和index属性
  • 原文地址:https://www.cnblogs.com/nzbbody/p/3454548.html
Copyright © 2011-2022 走看看