我试图寻找解决方案,但一无所获。如果这是重复的问题,我事先表示歉意。
我有一个这样的课:
class sync_lock {
public:
enum lock_status { free, locked };
pthread_cond_t cond;
pthread_mutex_t mtx;
lock_status status;
sync_lock() : status(free) {
pthread_cond_init( &cond, NULL );
pthread_mutex_init( &mtx, NULL );
}
sync_lock(const sync_lock & param) {
cond = param.cond;
mtx = param.mtx;
status = param.status;
}
sync_lock & operator=(const sync_lock & param) {
if (this == ¶m)
return *this;
cond = param.cond;
mtx = param.mtx;
status = param.status;
return *this;
}
~sync_lock() {
pthread_cond_destroy( &cond );
pthread_mutex_destroy( &mtx );
}
};
在驱动程序代码中,我有这个:
line 29: sync_lock lock();
line 30: lock_map[lid] = lock;
另一个地方有这个:
line 33: sync_lock & lock = lock_map[lid];
当我编译时,我得到了:
lock_server.cc: In member function ‘lock_protocol::status lock_server::acquire(int, lock_protocol::lockid_t, int&)’:
lock_server.cc:30:25: error: no match for ‘operator=’ in ‘((lock_server*)this)->lock_server::lock_map.std::map<_Key, _Tp, _Compare, _Alloc>::operator[] [with _Key = long long unsigned int, _Tp = sync_lock, _Compare = std::less<long long unsigned int>, _Alloc = std::allocator<std::pair<const long long unsigned int, sync_lock> >, std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type = sync_lock, std::map<_Key, _Tp, _Compare, _Alloc>::key_type = long long unsigned int]((*(const key_type*)(& lid))) = lock’
lock_server.cc:30:25: note: candidate is:
lock_server.h:33:21: note: sync_lock& sync_lock::operator=(const sync_lock&)
lock_server.h:33:21: note: no known conversion for argument 1 from ‘sync_lock()’ to ‘const sync_lock&’
make: *** [lock_server.o] Error 1
我不知道是什么导致了此错误。有什么想法吗?提前致谢!
这行:
sync_lock lock();
不按照您的想法去做。您期望它声明一个名为lock
type的变量,该变量sync_lock
是默认构造的。实际上,它声明了一个无参数的函数lock
,该函数返回一个sync_lock
实例。其原因被称为最烦人的解析。
因此,当您lock
在lock_map[lid]
不带括号的情况下分配给时lock
,实际上是在分配一个函数指针,而不是一个sync_lock
实例。这就是为什么您收到转换错误而不是调用=
运算符的原因。
解决方法是简单地将括号放在变量声明上:
sync_lock lock;
或者,完全摆脱变量:
lock_map[lid] = sync_lock();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句