问个关于<模板>的问题,挺难的 熟知<模板>编程的高手 进....
本人一时兴起 想要实现一个hashlist, 以前没怎么接触模板编程,对此了解不多,准备借此加深一下对模板和STL数据结构算法的了解。
在实现过程遇到 遇到了问题,当声明和实现分开的时候 会遇到如下问题,红色部分为声明 find函数,返回一个迭代器,迭代器在基类中定义。
如果子类CxHashList中 如果将声明和实现都放到.h文件中 就不会有问题,但是如果分开放置 会报错
貌似 在.hpp的实现中 作为返回值的CxIterator没有被识别出来,而函数实现部分的 CxIterator _it(pResult);是被识别出来了,如果我将返回值设置成void 那么可以编译过去 没有问题的,那就说明就是 CxIterator 的定义不识别,那么这种情况 应该怎么办呢?
我不想将实现和声明 放到一起 有什么办法 能实现我想要的么?.
如下是报错和代码中的一部分。
>f:\cxuilib\src\cxbase\CxMath.h(152) : warning C4101: “p”: 未引用的局部变量
1>f:\cxuilib\src\cxbase\CxTypes.hpp(240) : error C2143: 语法错误 : 缺少“;”(在“CxL::CxHashList<_Kty,_ty>::find”的前面)
1>f:\cxuilib\src\cxbase\CxTypes.hpp(240) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>f:\cxuilib\src\cxbase\CxTypes.hpp(240) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>f:\cxuilib\src\cxbase\CxTypes.hpp(240) : warning C4346: “CxL::CxHashList<_Kty,_ty>::find”: 依赖名称不是类型
1> 用“typename”为前缀来表示类型
1>f:\cxuilib\src\cxbase\CxTypes.hpp(240) : error C2143: 语法错误 : 缺少“,”(在“&”的前面)
[code=C/C++]
template<typename param>
class CxContainer
{
public:
//迭代器.
template<BOOL>
class __Iterator
{
public:
__Iterator():m_pItemSelf(NULL){}
__Iterator(CxItem<param>* pItem):m_pItemSelf(pItem){}
};
typedef typename __Iterator<TRUE> CxIterator;
};
template <class _Kty,class _ty>
class CxHashList:public CxContainer<CxPair<_Kty,_ty>>
{
public:
typedef CxPair<_Kty,_ty> Node;
CxIterator find(const _Kty& _key);
};
//在.hpp文件中 加入了 对应函数的实现部分如下
template <class _Kty,class _ty>
CxIterator CxL::CxHashList<_Kty,_ty>::find(const _Kty& _key)
{
DWORD m_dwKey = HashKeyPhp(_key,m_dwHashSize);
CxItem<Node>* pResult=NULL;
CxItem<Node>* pLastOne = m_pHashList[m_dwKey];
while(NULL!=pLastOne->GetNext()){
if(pLastOne->GetValue().first==_key){
pResult = pLastOne;
break;
}
pLastOne=pLastOne->GetNext();
}
CxIterator _it(pResult);
return _it;
}
[code]
[解决办法]
首先申明:很少有编译器支持模板分离编译的。记住:C++的模板现在只能写在一个文件里哦
[解决办法]
等赵老师吧。
我也觉得很可能是1楼说的问题,但一看楼主的回复,觉得不止1楼的问题。
[解决办法]
不支持分离编译的意思,就是:不要把声明放在hpp中,实现代码放在cpp中。你试试把hpp中的关于模板部分的内容剪切到对应的cpp中看看。
[解决办法]
楼主,不能分离编译的意思是,模板的实现,需要将所有东西都写在一个文件里,不能分成一个.h和一个.cpp,要不都写在.h里,要不都写在.cpp里.因为目前大多数编译器不支持模板的分离编译,所以你才会遇到"如果将声明和实现都放到.h文件中 就不会有问题,但是如果分开放置 会报错"这样的问题.