为什么在此类中复制构造函数,operator =和引用具有编译问题

用户名

我试图寻找解决方案,但一无所获。如果这是重复的问题,我事先表示歉意。

我有一个这样的课:

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 == &param)
                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

我不知道是什么导致了此错误。有什么想法吗?提前致谢!

雷米·勒博(Remy Lebeau)

这行:

sync_lock lock();

不按照您的想法去做。您期望它声明一个名为locktype的变量该变量sync_lock是默认构造的。实际上,它声明了一个无参数的函数lock,该函数返回一个sync_lock实例。其原因被称为最烦人的解析

因此,当您locklock_map[lid]不带括号的情况下分配lock,实际上是在分配一个函数指针,而不是一个sync_lock实例。这就是为什么您收到转换错误而不是调用=运算符的原因。

解决方法是简单地将括号放在变量声明上:

sync_lock lock;

或者,完全摆脱变量:

lock_map[lid] = sync_lock();

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么复制构造函数的参数是引用而不是指针?

来自分类Dev

为什么函数中本地定义的结构需要赋值运算符和复制构造函数

来自分类Dev

为什么调用具有不同类型的通用方法会导致编译错误?

来自分类Dev

为什么在此类中复制构造函数,operator =和引用具有编译问题

来自分类Dev

C ++ 11线程编译错误,删除了复制构造函数和std :: thread,为什么?

来自分类Dev

通配符引用具有INDIRECT函数的另一个工作簿

来自分类Dev

为什么在不使用new的情况下调用具有new的函数时不会返回相同的引用

来自分类Dev

为什么不只有一个?复制构造函数和赋值运算符

来自分类Dev

无法引用具有从另一个本地函数捕获的本地函数(Swift)

来自分类Dev

为什么在此函数调用中没有歧义?

来自分类Dev

此类型具有构造函数,必须在此处初始化-Kotlin

来自分类Dev

使用左值调用时不使用具有通用引用参数的函数

来自分类Dev

无法在Jekyll中引用具有正确基址的帖子

来自分类Dev

为什么右值/常量引用具有内存地址和大小?

来自分类Dev

为什么空的lambda和具有显式返回的构造函数会导致编译器错误(Java Bug?)

来自分类Dev

为什么在TypeScript中没有重载的构造函数实现?

来自分类Dev

为什么在此示例中调用了复制构造函数?

来自分类Dev

可以在带有右值引用的函数中直接使用具有左值引用的函数吗?

来自分类Dev

什么是引用复制构造函数?

来自分类Dev

引用具有禁用的复制构造函数/分配的对象

来自分类Dev

为什么复制构造函数的参数是引用而不是指针?

来自分类Dev

ghci编译器优化:两次调用具有相同参数的函数

来自分类Dev

为什么在最后一行中也没有调用复制构造函数?

来自分类Dev

在Angular中引用具有表单值的元素

来自分类Dev

为什么构造函数中的全局变量和参数变量不能具有相同的名称?

来自分类Dev

无法在Jekyll中引用具有正确基址的帖子

来自分类Dev

为什么当用户提供移动构造函数或移动分配时,复制构造函数和复制分配会被删除?

来自分类Dev

在Javascript中,为什么应将具有引用类型的实例变量放入构造函数中?

来自分类Dev

调用具有javascript函数的方法的投射问题

Related 相关文章

  1. 1

    为什么复制构造函数的参数是引用而不是指针?

  2. 2

    为什么函数中本地定义的结构需要赋值运算符和复制构造函数

  3. 3

    为什么调用具有不同类型的通用方法会导致编译错误?

  4. 4

    为什么在此类中复制构造函数,operator =和引用具有编译问题

  5. 5

    C ++ 11线程编译错误,删除了复制构造函数和std :: thread,为什么?

  6. 6

    通配符引用具有INDIRECT函数的另一个工作簿

  7. 7

    为什么在不使用new的情况下调用具有new的函数时不会返回相同的引用

  8. 8

    为什么不只有一个?复制构造函数和赋值运算符

  9. 9

    无法引用具有从另一个本地函数捕获的本地函数(Swift)

  10. 10

    为什么在此函数调用中没有歧义?

  11. 11

    此类型具有构造函数,必须在此处初始化-Kotlin

  12. 12

    使用左值调用时不使用具有通用引用参数的函数

  13. 13

    无法在Jekyll中引用具有正确基址的帖子

  14. 14

    为什么右值/常量引用具有内存地址和大小?

  15. 15

    为什么空的lambda和具有显式返回的构造函数会导致编译器错误(Java Bug?)

  16. 16

    为什么在TypeScript中没有重载的构造函数实现?

  17. 17

    为什么在此示例中调用了复制构造函数?

  18. 18

    可以在带有右值引用的函数中直接使用具有左值引用的函数吗?

  19. 19

    什么是引用复制构造函数?

  20. 20

    引用具有禁用的复制构造函数/分配的对象

  21. 21

    为什么复制构造函数的参数是引用而不是指针?

  22. 22

    ghci编译器优化:两次调用具有相同参数的函数

  23. 23

    为什么在最后一行中也没有调用复制构造函数?

  24. 24

    在Angular中引用具有表单值的元素

  25. 25

    为什么构造函数中的全局变量和参数变量不能具有相同的名称?

  26. 26

    无法在Jekyll中引用具有正确基址的帖子

  27. 27

    为什么当用户提供移动构造函数或移动分配时,复制构造函数和复制分配会被删除?

  28. 28

    在Javascript中,为什么应将具有引用类型的实例变量放入构造函数中?

  29. 29

    调用具有javascript函数的方法的投射问题

热门标签

归档