关于类模版:如何实现类模版设计与实现分离的分离编译模式

lzp729 2006-12-21 10:38:55
对于模版函数可以这样:
// templatefunc.h
#ifndef TEMPLAFUNC_H
#define TEMPLAFUNC_H

template <typename T> int compare(const T&, const T&);
#include "templafunc.cpp"

#endif

// templafunc.cpp
template <typename T> int compare(const T &v1, const T &v2)
{
if(v1 < v2) return -1;
if(v2 < v1) return 1;
return 0;
}

// main.cpp
#include <cstdlib>
#include <iostream>
#include "templafunc.h"
using namespace std;
int main(int argc, char *argv[])
{
cout << compare(3,4) << endl;
t.print();
system("PAUSE");
return EXIT_SUCCESS;
}

// OK!
____________________________________________________
而对于类模版, 我可以这样完成做
// templafunc.h 包含类模版的定义和成员的定义
#ifndef TEMPLAFUNC_H
#define TEMPLAFUNC_H

template <typename T>
class Test
{
public:
Test(T);
void print();
private:
T a;
};

template<typename T> Test<T>::Test(T r) : a(r){}

template<typename T> void Test<T>::print()
{
cout << a << endl;
}

#endif

// main.cpp
#include <cstdlib>
#include <iostream>
#include "templafunc.h"

using namespace std;

int main(int argc, char *argv[])
{
Test<int> t(10.6);
t.print();
system("PAUSE");
return EXIT_SUCCESS;
}

//OK, 然而这样就不得不把类模版的成员定义也写到头文件中,为了能够将设计与实现分离,我按照最上面的函数的形式组织代码,但是编译过不了,请指教应该如何安排这种代码,谢谢
...全文
688 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzp729 2006-12-23
  • 打赏
  • 举报
回复
SammyLan((闭关修炼内功)一无是处是C++高手): 我是用VS2005编译通过的,编译期认可include cpp
taodm(taodm): 在<C++ Primer> 第四版 模版那一章有我给出的跟第一段代码类似的结构安排

谢谢大家给我的建议,我决定还是放到一个头文件中算了
SammyLan 2006-12-22
  • 打赏
  • 举报
回复
不讨论那些问题了,没意义

建议楼主
对于模板,还是将声明和定义全部放在头文件比较好(=_=)
SammyLan 2006-12-22
  • 打赏
  • 举报
回复
不知道你说的makefile对*.cpp编译的时候会出现什么问题
在Win下 MakeFile木有问题的说..............
lzp729 2006-12-22
  • 打赏
  • 举报
回复
再等等吧
其实我原来看primer 3e的时候自己写出来了这种代码,只是隐约记得再CPP里面也用到类似头文件的展开保护机制,但是我原来的代码找不到了,昨天要用到这个东西,想把成员的实现和模版的定义分到CPP文件和H文件中,我想了半天还是没有想起来怎么安排,唉,再等等,再等等
sopro 2006-12-22
  • 打赏
  • 举报
回复
其实分离了又有什么用了,不管用那种方法,经过precompile处理过,都是一样的
lzp729 2006-12-22
  • 打赏
  • 举报
回复
恩 是啊 但是类模版应该怎样安排代码呢?等好久了 唉
sopro 2006-12-22
  • 打赏
  • 举报
回复
是滴,lz是看过c++primer的人把,呵呵,那个上面提出的这个分离的方法:)
taodm 2006-12-22
  • 打赏
  • 举报
回复
SammyLan((闭关修炼内功)一无是处是C++高手) ,尝过苦头才对一些东西有更深刻的理解。
用makefile对*.cpp编译的时候,这些伪cpp就成为痛苦了。
SammyLan 2006-12-22
  • 打赏
  • 举报
回复
1.#include "templafunc.cpp"这种方式,我以前在VS2003下面试过,没成功。后来跑到linux下面用g++就编过了,搞定。这种方式实际上就是在precompile阶段进行一个宏展开。微软的编译器不认可能是因为它不支持.cpp的这种格式

不知道你的VS2003跟我的VS2003有什么不同,我的VS2003完全可以编译通过并正确链接运行(=_=)


#include cpp文件是一种很垃圾的编程风格。
按C++通行编程风格,可以include的只.h/.hpp/.cc/无后缀4种。
请尽量遵守这个通行约定。
模板的所有内容都必须放在头文件里被include的,就不要拆在多个文件里了。


#include cpp文件是一种很垃圾的编程风格。
...................
这位仁兄说话不要太武断了,建议你去看看The C++ Templates(=_=)
条件编译加#include cpp是这本号称Template bible的作者所推荐的从"未实现分离编译模式到实现县分离编译模式"的首选策略-_-!
Wolf0403 2006-12-22
  • 打赏
  • 举报
回复
把实现写在一个单独文件里,命名为 .i 或 .icc,然后在 .hpp 声明之后写
#include "xxx.icc"
taodm 2006-12-22
  • 打赏
  • 举报
回复
"include cpp是Lippman",出处在哪?
wb19822002 2006-12-22
  • 打赏
  • 举报
回复
lz是想要的下面这种保护吗?

//test.h
#ifndef TEMPLAFUNC_H
#define TEMPLAFUNC_H

template <typename T>
class Test
{
...
};

#include "test.cpp"
#endif /* TEMPLAFUNC_H */

//test.cpp
#ifndef TEMPLAFUNC_CPP
#define TEMPLAFUNC_CPP

#include "test.h"

template<typename T> Test<T>::Test(T r) : a(r){}

template<typename T> void Test<T>::print()
{
cout << a << endl;
}

#endif /* TEMPLAFUNC_CPP */
gongxuanjrj 2006-12-22
  • 打赏
  • 举报
回复
C++中类模板的声明和定义通常建议放在一个.H文件中,因为模板必须实例化一个类,才能够有意义.模板的申明和定义有些编译器可能支持,但是大多数还是不支持的,为了让你的代码能够很好的PORTING,还是建议你把二者放在一个HEAD文件里
lzp729 2006-12-21
  • 打赏
  • 举报
回复
昏,include cpp是Lippman写的啊,他是MS架构师啊
只是他没有写出来类模版的代码应该怎么安排,所以我就来问拉
sopro 2006-12-21
  • 打赏
  • 举报
回复
哦,VC8?你是指VS2005么?
本机器上面没装

反正你如果使用微软的编译器话,还是老老实实搞一个.h文件把,稳妥,可移植性高:)
lzp729 2006-12-21
  • 打赏
  • 举报
回复
第一段代码VC8编译运行OK
lzp729 2006-12-21
  • 打赏
  • 举报
回复
我现在试试VC8
lzp729 2006-12-21
  • 打赏
  • 举报
回复
第一段代码我在dev编译OK
sopro 2006-12-21
  • 打赏
  • 举报
回复
我碰见的错误是:在查找预编译的头指令时候遇到意外的文件结尾
sopro 2006-12-21
  • 打赏
  • 举报
回复
看懂lz的意思了,汗一个

我刚才又试了一下,无论是函数接口分离或是类接口分离,使用#include XXX.cpp的这种方式在VS2003里面都不能成功

lz什么编译器啊???
加载更多回复(11)

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧