类模板和模板函数连接出错处理

 对C++编译器而言,当调用函数的时候,编译器只需要看到函数的声明。当定义类类型的对象时,编译器只需要知道类的定义,而不需要知道类的实现代码。因此,因该将类的定义和函数声明放在头文件中,而普通函数和类成员函数的定义放在源文件中。

 但在处理模板函数和类模板时,问题发生了变化。要进行实例化模板函数和类模板,要求编译器在实例化模板时必须在上下文中可以查看到其定义实体;而反过来,在看到实例化模板之前,编译器对模板的定义体是不处理的——原因很简单,编译器怎么会预先知道 typename 实参是什么呢?因此模板的实例化与定义体必须放到同一翻译单元中。

《C++编程思想》第15章(第300页)说明了原因:
模板定义很特殊。由template<…> 处理的任何东西都意味着编译器在当时不为它分配存储空间,它一直处于等待状态直到被一个模板实例告知。在编译器和连接器的某一处,有一机制能去掉指定模板的多重定义。所以为了容易使用,几乎总是在头文件中放置全部的模板声明和定义。



以下是模板声明和定义的两种方法:
1)可以通过在声明函数模板或类模板的头文件中添加一条#indlude指示定义可用,引入了包含相关定义的源文件。
//set.h file
#ifndef _SET_H_J
#define _SET_H_J

#include 
<list>

template
<class T>
class Set_j
{
public:
    std::size_t size();
    
void insert(const T& item);
    
void remove(const T& item);
    
bool is_has(const T& item);
private:
    std::list
<T> m_list;
};

#include 
"set.cpp"

#endif

// set.cpp file
#ifndef _CPP_SET_J
#define _CPP_SET_J
#include 
"set.h"
#include 
<algorithm>

template
<class T>
std::size_t Set_j
<T>::size()
{
    
return m_list.size();
}

template
<class T>
void Set_j<T>::insert(const T& item)
{
    
if(!is_has(item))
    {
        m_list.push_back(item);
    }
}

template
<class T>
void Set_j<T>::remove(const T& item)
{
    std::list
<T>::iterator it = std::find(m_list.begin(),m_list.end(),item);

    
if(it != m_list.end())
    {
        m_list.erase(it);
    }
}

template
<class T>
bool Set_j<T>::is_has(const T& item)
{
    
return (std::find(m_list.begin(),m_list.end(),item) != m_list.end());
}
#endif

// main.cpp  file
#include <iostream>
#include 
"set.h"

void main()
{
    Set_j
<int> test;

    std::cout 
<< "size: " << test.size() << std::endl;

    
int i = 10;

    test.insert(i);
    test.insert(i
+1);
    test.insert(i
+2);
    test.insert(i
+2);

    std::cout 
<< "size: " << test.size() << std::endl;

    test.remove(i
+2);

    std::cout 
<< "size: " << test.size() << std::endl;
}

2)通过关键字export实现。
  C++理论上支持模板的分离编译(也就是支持export关键词),但是实际上VC2005,vs2010均不支持,在 VS 2008 中,export 关键字在 IDE 中被标蓝,表示 VS IDE 认识它,而编译时,会用警告友情提示你“不支持该关键字”。
3)将定义和实现文件写在一个文件中。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
淘客帝国V5.23稳定版,符合淘宝搜索新规范 后台管理全内置, 别的破解版没有的10大重点 1. 增加自定义页面整合 2. 增加OEM模板 两套 共15套模板 3. 增加文章整合 完整版后台 4. 增加图片延时加载 5. 修正API 新规则问题,改正搜索栏进入淘宝S8 6. 增加自定义广告一项 7. 增加伪静态设置 后台完全版 8. 伪原创功能 后台自由配置 9. 后台配置本地内置化 10. 整合淘宝页面,整合个性自定义页面多项功能 ------------------------------------------------ 【V5.23更新内容】 6月8日,更新了一些BUG:红色风模板内页仍然有搜索框的问题、API出错会输出代码的问题等。有需要者请更新。 处理淘宝新的修改问题,去除站内搜索改成进入淘宝搜索。 配置中心里顺序调整都不能及时同步到本地的BUG修复。 配置中心里增加新配置:页面和窗口设置。 喜**模板处理友情链接太多会失效的问题。 全站打开新窗口的设置,以及搜索开新窗口的设置。 搜索栏默认类别设置错误修复。 处理API调用失败重新刷新又正常了的问题 api商品 下架的商品,增加设置返回404或者是商品推荐列表 重新整理所有图片的alt属性,确保每个图片都有。 特约导购栏目部分连接失效的问题解决。 调整API调用判断,加强调用稳定性 调用文章时不调用织梦回收站里的文章。 discuz7.2未审核帖子也会调出来的问题处理。 伪静态开关统一放到自定义伪静态栏目里。 【V5.21更新内容】 增加了图片延迟加载功能 支持整合文章系统PHPwnd 后台增加开关,可开启所有内页直接跳转淘宝对应页面。跳转方式为301. 首页每个模块支持店铺 一个是"详情关键词自动锚链接"和"热门搜索关键词"不能限定类别ID 另一个是搜索商品的列表,希望能把关键词参数传递进子分类链接中 wordpress的整合BUG 类别不准确的问题。 搜索模板的LOGO设置问题。 返现比率排序 针对屏蔽调用函数的一些服务器增加处理,很多屏蔽了函数的服务器仍然可以用了。 充值框出错的问题,增加一个浮动充值框,增加 手机,游戏卡,旅行等充值。 红色主题首页商品显示兼容性,标题超长会导致错位。 默认模板的我的位置 ,类别和关键词连接没分开。 搜索栏类别列表自动识别当前类别 增加了调用API的函数,确保部分屏蔽函数的空间一样可以使用 支持wordpress文章的定时发布功能。 屏蔽蜘蛛功能改进,给蜘蛛返回404页面。 商品详情的大图也连接到淘宝。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值