关于c++模板

henanlsl 2010-09-28 08:12:22
template<typename DataType>
struct ptrT
{
DataType* ptrData;
unsigned int count;
bool bUseLockedPage;
};
template<typename T>
struct s_CSR
{//CSR format matrix
ptrT<unsigned int >ptrRowptr;
ptrT<unsigned int >ptrCol;
ptrT<T> ptrElem;
};
...全文
551 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
coder_xia 2010-09-29
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 henanlsl 的回复:]

模板类的定义和实现要放在同一文件中
今天写程序,将模板内的定义放在了.h文件中,而实现放在了.cpp中,

编译通过了,可连接怎么也不能成功。。

查了一些书才知道,模板类的定义和实现必须放在同一文件,

《c++编程思想》中说:模板类定义很特殊,由template<...>定义的任何东西都意味着编译器在当时不为它分配内存空间,它一直处于等待状态,直到被一个模板实例告知,即模板参……
[/Quote]

学习了
forwin 2010-09-29
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 henanlsl 的回复:]
引用 8 楼 pengzhixi 的回复:
将.cpp里面那些成员函数的定义放到.h里面

我的实现函数在。CPP中
函数声明在。H中
觉得这个应该没问题
[/Quote]

就是这个引起的问题!
放到.H中就可以了
henanlsl 2010-09-29
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 gules 的回复:]

C/C++ code

template <typename S>
void InitPtrT(ptrT<S> ptrData,bool bUseLockedPage) //将此函数定义为模板类里的模板函数
{
ptrData.ptrData=NULL;
ptrData.count=0;
ptrData.bUseLockedPage=bUseLockedPage;
}
……
[/Quote]

说的很对,昨天晚上刚发现这个问题,不过又出现了新的问题
原来,只有确定模板语法语义没错之后,编译器才会检查其实方面的语法
gules 2010-09-28
  • 打赏
  • 举报
回复

template <typename S>
void InitPtrT(ptrT<S> ptrData,bool bUseLockedPage) //将此函数定义为模板类里的模板函数
{
ptrData.ptrData=NULL;
ptrData.count=0;
ptrData.bUseLockedPage=bUseLockedPage;
}
genlic 2010-09-28
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 henanlsl 的回复:]

引用 8 楼 pengzhixi 的回复:
将.cpp里面那些成员函数的定义放到.h里面

为什么要放定义中的?
[/Quote]
模板里面不这么做的话很恶心的。。。= =
henanlsl 2010-09-28
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 namelij 的回复:]

引用 19 楼 henanlsl 的回复:
还是有问题:
CWarpMatrix():
colsNum(0),
rowsNum(0),
elemsNum(0)
{
bDataLoaded=false;

InitPtrT(matrixCSR.ptrRowptr,true);//有问题
InitPtrT(matrixCSR.ptrCol,true);//有问题
InitPtr……
[/Quote]
编译报错
error C2664: “CWarpMatrix<T>::InitPtrT”: 不能将参数 1 从“ptrT<T>”转换为“ptrT<T>”
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 henanlsl 的回复:]
还是有问题:
CWarpMatrix():
colsNum(0),
rowsNum(0),
elemsNum(0)
{
bDataLoaded=false;

InitPtrT(matrixCSR.ptrRowptr,true);//有问题
InitPtrT(matrixCSR.ptrCol,true);//有问题
InitPtrT(matrixCSR.ptrElem,true……
[/Quote]
不明白你想问什么,也不知道你要干什么

henanlsl 2010-09-28
  • 打赏
  • 举报
回复
还是有问题:
CWarpMatrix():
colsNum(0),
rowsNum(0),
elemsNum(0)
{
bDataLoaded=false;

InitPtrT(matrixCSR.ptrRowptr,true);//有问题
InitPtrT(matrixCSR.ptrCol,true);//有问题
InitPtrT(matrixCSR.ptrElem,true);//没问题
。。。
}

void InitPtrT(ptrT<T> ptrData,bool bUseLockedPage)
{
ptrData.ptrData=NULL;
ptrData.count=0;
ptrData.bUseLockedPage=bUseLockedPage;
}

分析不出原因。。。。。
ptrElem为模板 T,这一行没问题
ptrRowptr为unsigned int 类型,有问题
怎么解释。。。。。?
chaoyue8586 2010-09-28
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 henanlsl 的回复:]
引用 8 楼 pengzhixi 的回复:
将.cpp里面那些成员函数的定义放到.h里面

我的实现函数在。CPP中
函数声明在。H中
觉得这个应该没问题
[/Quote]
的确没有问题!
gules 2010-09-28
  • 打赏
  • 举报
回复
你查“模板分离编译”的内容就知道了,最好模板类的定义都放在头文件中。
henanlsl 2010-09-28
  • 打赏
  • 举报
回复
模板类的定义和实现要放在同一文件中
今天写程序,将模板内的定义放在了.h文件中,而实现放在了.cpp中,

编译通过了,可连接怎么也不能成功。。

查了一些书才知道,模板类的定义和实现必须放在同一文件,

《c++编程思想》中说:模板类定义很特殊,由template<...>定义的任何东西都意味着编译器在当时不为它分配内存空间,它一直处于等待状态,直到被一个模板实例告知,即模板参数是由编译器来替换的。
为了容易使用,几乎总是在头文件中放置全部的模板声明和定义。有时,也可能为了满足特殊需要而要在独立的cpp中放置模板的实现。但大部分现在的编译器还不支持模板类的定义和实现分开

刚查了,谢谢各位,我先试
pengzhixi 2010-09-28
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 henanlsl 的回复:]
引用 8 楼 pengzhixi 的回复:
将.cpp里面那些成员函数的定义放到.h里面

我的实现函数在。CPP中
函数声明在。H中
觉得这个应该没问题
[/Quote]不要觉得,你先试了再说
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 henanlsl 的回复:]
引用 8 楼 pengzhixi 的回复:
将.cpp里面那些成员函数的定义放到.h里面

我的实现函数在。CPP中
函数声明在。H中
觉得这个应该没问题
[/Quote]
标准规定 实现与定义必须在同一个文件
henanlsl 2010-09-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 pengzhixi 的回复:]
将.cpp里面那些成员函数的定义放到.h里面
[/Quote]
我的实现函数在。CPP中
函数声明在。H中
觉得这个应该没问题
  • 打赏
  • 举报
回复
模板的定义与声明 必须放在同一个文件里面
henanlsl 2010-09-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 pengzhixi 的回复:]
将.cpp里面那些成员函数的定义放到.h里面
[/Quote]
为什么要放定义中的?
henanlsl 2010-09-28
  • 打赏
  • 举报
回复
我怀疑是多次嵌套造成的:
s_CSR<T> matrixCSR;
s_CSR中包含ptrT 类型元素
ptrT<T> ptrElem;
ptrT 中包含DataType类型元素
DataType* ptrData;

大家什么看法。。。还是我的调用出了问题
CWarpMatrix<float> matrix;
matrix.LoadMtxToWarpELL(filename);
cheng_fengming 2010-09-28
  • 打赏
  • 举报
回复
下次一定要把问题问清楚,不然大家没法帮你。
pengzhixi 2010-09-28
  • 打赏
  • 举报
回复
将.cpp里面那些成员函数的定义放到.h里面
henanlsl 2010-09-28
  • 打赏
  • 举报
回复
我是VS2008,不知道为什么会出现问题。。。。
加载更多回复(6)

64,654

社区成员

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

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