2015-09-10 116 views
1

它看起來像問題6880832指針類成員作爲模板參數有我的問題的答案但它不回答如何引用模板內的指針類。我有這麼遠:指向非靜態成員變量作爲模板參數

template<typename C, typename T, T C::*m, int direction> 
class Cmp { 
private: 
    bool isAscend = direction; 
public: 

    bool operator()(const C* lhs, const C* rhs) { 
     return isAscend ? 
      rhs->m > lhs->m : 
      lhs->m > rhs->m; 
    }// bool operator()(const UnRecTran* lhs,const UnRecTran* rhs) 

};// class Cmp 
Cmp<UnRecTran, shrtDate, &UnRecTran::date, true> 

(我試圖做UnRecTran ::日期值比較,在這個特殊的實例)。但是,我得到「'm':不是'UnRecTran'的成員」。

我試圖做甚至可能嗎?我明白成員變量的「地址」是不變的 - 它只是對象開始的偏移量,而不是物理(運行時)地址。

回答

4

通過一個指針到成員的訪問成員對數據的語法是:

obj.*m_ptr //obj is class type 
p_obj->*m_ptr //p_obj is pointer to obj 

您的運營商或許應該是這樣的:

bool operator()(const C* lhs, const C* rhs) { 
    return isAscend ? 
     rhs->*m > lhs->*m : 
     lhs->*m > rhs->*m; 
} 
+0

@TartLlama感謝您的。我曾嘗試解引用m,但得到了「 '專業化':無法從'int UnRecTran :: *'轉換爲'shrtDate UnRecTran :: *'」直接實例化(最後一行代碼)。 – willofirony

+0

@willofirony在看不到聲明的情況下無法真正幫助你解決這個錯誤,但是我猜'date'被聲明爲'int'而不是'shrtDate'什麼的。 – TartanLlama

+0

@TartLlarma明白了。你在解引用上是100%正確的。最初被分類的類有一個shrtDate成員,但我用一個int成員組成了一個虛擬類(爲了簡化調試 - 是的,我寫了簡化)。經過一堆其他的「簡化」之後,它就迷失了。該模板現在一般工作。謝謝 – willofirony

相關問題