解决来自 const 的无效转换
Working around invalid conversion from const
我正在我的Raspberry Pi上编译Percona(MySQL变体(,它有一个ARM处理器。
我在编译过程中遇到了一个已报告的问题,但没有人愿意修复,因为 ARM 是一个不受支持的平台。
https://bugs.launchpad.net/percona-server/+bug/1002848
我已经设法解决了这个问题并成功编译,但我的 c++ 知识有些缺乏,我不完全明白我是否真的破坏了某些东西。
我已经阅读了很多关于 SO 的从 const char* 到 char* 问题的无效转换,这就是我得到这个解决方法的想法的地方。
错误如下:
error: invalid conversion from 'const pthread_mutex_t*' to 'pthread_mutex_t*'
(它实际上没有在我的平台上pthread_mutex_t
,但问题是相同的 - 实际类型丢失到无限深渊,即回滚缓冲区(
有问题的代码是:
uint32 count(uint index) const
{
my_atomic_rwlock_rdlock(&time_collector_lock);
我将其更改为:
uint32 count(uint index) const
{
my_atomic_rwlock_t dummy = time_collector_lock;
my_atomic_rwlock_rdlock(&dummy);
time_collector_lock定义为:
private:
my_atomic_rwlock_t time_collector_lock;
由于这应该是一个互斥锁,我有一种感觉,我可能已经使这个非线程安全。或者可以吗?
有没有更好的解决方案?
似乎在
类中,您已将成员数据声明为:
pthread_mutex_t time_collector_lock;
因此,在 const
成员函数中,此成员数据变得好像您已将其声明为:
const pthread_mutex_t time_collector_lock; //(as-if declaration)
这导致了问题,因为您无法将指向 const 对象的指针传递到my_atomic_rwlock_rdlock()
这需要指向非 const 对象的指针。
关键字mutable
可以在这里保存您。将成员数据声明为对象mutable
为:
mutable pthread_mutex_t time_collector_lock;
//^^^^^^note this
现在,您也可以在成员函数中使用成员数据const
:
uint32 count(uint index) const
{
my_atomic_rwlock_rdlock(&time_collector_lock); //ok now!
相关文章:
- C++ PTHREADS - 无效转换无效*(*)()到无效*(*)(无效*)
- is_same和variadic模板编译时错误无效转换
- 如何将常量无效*转换为istream?
- 无效* 转换获得意外输出
- 无法确定为什么函数调用中从 char* 到 char 的无效转换
- 在这个简单函数中从'char'到'const char*'的无效转换
- C++从 'const char*' 到 'char*' Arduino Uno 的无效转换
- 如何修复C++中的"错误:从'int'到'const char*'[-fallowive]的无效转换?
- C 错误:从(基类模板)到子类的无效转换
- 如何将常量无效*转换为无符号字符*
- 函数模板中的无效转换错误,返回值取决于其泛型类型
- 常量正确性编译错误到模板函数中的无效转换错误
- 从"char"到"const char*"的无效转换[-fpermissive](idk why)
- 从“ void*”到“ pthread_t*”的无效转换
- 当函数调用时,试图阻止数组更改时发生无效转换错误
- 使用基类中定义的函数返回指向派生类实例的指针时发生无效转换错误
- C++从字符到常量字符*的无效转换
- ALL_OF从'char'到'const char*'的无效转换 [-允许]
- C和C++上的无效转换错误
- C++ 在模板专用化中从 strcmp() 中的 'char' 到 'const char*' 的无效转换