2012-07-16 37 views
6

我在我的Raspberry Pi上編譯了Percona(MySQL變體),它有一個ARM處理器。解決const的無效轉換問題

我在編譯過程中遇到了一個報告過的問題,但沒人願意修復,因爲ARM是不受支持的平臺。

https://bugs.launchpad.net/percona-server/+bug/1002848

我已經設法解決這個問題,並編譯成功,但我的C++的知識有所欠缺,我不完全明白,如果我實際上已經打碎了什麼東西或沒有。

我已經閱讀了很多從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; 

由於這應該是互斥的事實,我有我可能使這個非線程安全的感覺。或者這可以嗎?

有沒有更好的解決方案?

+0

爲什麼不使用'const_cast'?你將使你的**意圖清晰**,並且你不會創建pthread_mutex_t的**副本... – 2012-07-16 09:57:16

+0

如果你試圖將最初聲明爲const的一個對象const_cast,結果是UB – SingerOfTheFall 2012-07-16 10:01:36

+0

@SingerOfTheFall **只有** const_cast的目的是去掉const。 – 2012-07-16 10:02:51

回答

10

看來,在類,聲明該成員數據:

pthread_mutex_t time_collector_lock; 

所以在const成員函數,該成員的數據變得彷彿你已經宣佈它爲:

const pthread_mutex_t time_collector_lock; //(as-if declaration) 

這是造成問題,因爲你不能傳遞指針常量對象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! 
+2

我有這種模式。鎖等不是對象邏輯狀態的一部分(事實上,它們的用途是保持其邏輯狀態),所以在必要時應該是可變的。 – 2012-07-16 10:02:45

+3

它實際上被定義爲'my_atomic_rwlock_t time_collector_lock;'添加'可變'做了訣竅。非常感謝! – Leigh 2012-07-16 10:11:48

相關問題