模板中这样定义的类型无法通过编译

old-six-programmer 2009-03-19 04:08:34
一下代码是对map的一个简单包装,利用读写锁,以期获得线程安全性
可是代码编译不通过,见注释


#include <pthread.h>
#include <map>
#include <algorithm>

#define MapIter map<KeyType, ValueType>::iterator

using namespace std;

template<typename KeyType, typename ValueType>
class CThreadSafeMap
{
public:
//typedef map<KeyType, ValueType>::iterator MapIter; //编译器对这样的类型不允许typedef,为何?

CThreadSafeMap();
~CThreadSafeMap();

MapIter Find( const KeyType& key ) const; //提示MapIter不能作为返回类型
void Insert( const pair<KeyType, ValueType>& entry );

private:
map<KeyType, ValueType> map_;
pthread_rwlock_t lock_;
};

template<typename KeyType, typename ValueType>
CThreadSafeMap<KeyType, ValueType>::CThreadSafeMap()
{
pthread_rwlock_init( &lock_, NULL );
}

template<typename KeyType, typename ValueType>
CThreadSafeMap<KeyType, ValueType>::~CThreadSafeMap()
{
pthread_rwlock_destroy( &lock_ );
}

template<typename KeyType, typename ValueType>
MapIter CThreadSafeMap<KeyType, ValueType>::Find( const KeyType& key ) //此处同上
{
pthread_rwlock_rdlock( &lock_ );

MapIter iter = map_.find( key ); //此处能够通过编译

pthread_rwlock_unlock( &lock_ );

return iter;
}

template<typename KeyType, typename ValueType>
void CThreadSafeMap<KeyType, ValueType>::Insert( const pair<KeyType, ValueType>& entry )
{
pthread_rwlock_wrlock( &lock_ );

map_.insert( entry );

pthread_rwlock_unlock( &lock_ );
}
...全文
194 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
arong1234 2009-03-19
  • 打赏
  • 举报
回复
MapIter 是在类内部定义的,因此需要是

typename CThreadSafeMap<KeyType,ValueType>::MapIter
old-six-programmer 2009-03-19
  • 打赏
  • 举报
回复
多谢akirya提示
typedef已经解决

不过,MapIter在下面这句还是会报错
 
MapIter CThreadSafeMap<KeyType, ValueType>::Find( const KeyType& key )


鉴于arong的批评,特将错误拷贝下来,具体错误如下
threadsafemap.h:39: error: expected constructor, destructor, or type conversion before "CThreadSafeMap"
threadsafemap.h:39: error: expected `;' before "CThreadSafeMap"

编译器貌似不允许返回MapIter类型
换成bool能够通过编译
  • 打赏
  • 举报
回复

#define MapIter map<KeyType, ValueType>::iterator //你后面定义了局部的,这里又声明一个宏,而且这样的宏定义还是有问题的

using namespace std;

template<typename KeyType, typename ValueType>
class CThreadSafeMap
{
public:
//typedef map<KeyType, ValueType>::iterator MapIter; //编译器对这样的类型不允许typedef,为何?

  • 打赏
  • 举报
回复
#define MapIter map<KeyType, ValueType>::iterator

之前这句放到后面看下,这里KeyType跟ValueType都没用由template声明的。
pengzhixi 2009-03-19
  • 打赏
  • 举报
回复
我觉得不能这么包装吧.#define MapIter map<KeyType, ValueType>::iterator
因为你的iterator的类型本来就依赖KeyType, ValueType这两个模板参数.你这样,我估计编译器无法解析

template<typename KeyType, typename ValueType,typename CONS=map<KeyType, ValueType> >
class CThreadSafeMap
{
这样会不会好点.

arong1234 2009-03-19
  • 打赏
  • 举报
回复
问问题要尽量提供丰富的信息,例如你编译过不了,错误是什么?难道要别人把代码拷贝下来再编译一遍么?
  • 打赏
  • 举报
回复
typedef typename map<KeyType, ValueType>::iterator MapIter; //编译器对这样的类型不允许typedef,为何?
solo_coder 2009-03-19
  • 打赏
  • 举报
回复

大概是因为使用了template的缘故吧。

65,211

社区成员

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

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