2011-09-05 109 views
0

我正在嘗試一個簡單的C++屬性系統的實現,我發現它hereC++模板錯誤

但是代碼不會編譯。

template <class T, class Object, typename T (Object::*real_getter)()> 
class ReadOnlyProperty 
{ 
    Object * my_object; 
public: 
    void operator() (Object * obj) 
    { 
     my_object = obj; 
    } 

    T operator()() const 
    { 
     return (my_object->real_getter)(); 
    } 


    T get() const 
    { 
     return (my_object->real_getter)(); 
    } 


    void set(T const & value); 


    operator T() const { 
     return (my_object->*real_getter)(); 
    } 

    typedef T value_type; 

}; 

我在第一行得到多個錯誤。我使用的是Xcode 4,LLVM 2.1或GCC 4.2都不能編譯它。有什麼問題?

+0

Mi也不是,也不相關,風格註釋:使用例如: 'operator ='''重置'你的代理而不是'operator()'。或者使用指定的成員(提供它也是常見的),例如'reset'通常用於智能指針。 –

回答

4

的成員函數指針可以是一個模板參數,但在這種情況下,你不應該把typename前:

template <class T, class Object, T (Object::*real_getter)()> 

其他錯誤是呼叫:

(my_object->real_getter)() 

這應該是:

(my_object->*real_getter)() 
+0

啊,你可能會想要OP想要的! :-) –

+0

現貨。謝謝! –

0

模板參數列表不起作用。模板參數必須是以下類型之一:類型名稱,類型(帶限制)或模板。

也許你的意思是有一個默認類型,像這樣?

template <class T, 
      class Object, 
      typename U = T (Object::*real_getter)()> 
class ... 

這裏U默認爲指針到成員函數,但你必須提供包括返回類型的完整簽名。

還是你的意思是real_getter要成爲typedef?

template <class T, class Object> 
class ReadOnlyProperty 
{ 
    typedef typename T (Object::*real_getter)(); 
    //... 
}; 

或者作爲@jmihalicza建議,你要T (Object::*)()類型的值參數?

template <class T, class Object, T (Object::*real_getter)()> 
class ReadOnlyProperty 
{ //... 
}; 
+0

這些標準名稱是* template非類型參數*(又名非類型參數),以及*模板類型參數*和*模板模板參數*。 (不要混淆:模板不是類型,但模板參數種類不重疊。) –

+0

非常好,謝謝你的澄清 - 那些確實是很酷的名字,而「template template argument」是我最喜歡的一天: - ) –