2011-03-02 367 views
0

我正在測試一個屬性系統,我想確保根類可以保存函數指針,這個函數指針指向的是派生類。因此,我有一些工作。大多數派生類正在工作(RC2),但當前中間類(RC1)將有編譯器錯誤。我想能夠實例化RC1和RC2。編譯器錯誤創建時,我將與RC得到的是(對於RC1<RC1> rc1test;行)默認的模板參數

錯誤C2955:「RC1」:使用類模板需要模板參數列表

錯誤C3203:「RC1」 :非專業化的類模板不能作爲模板參數「PropertyOwner」模板參數,預計一個真正的類型

我試圖做RC1<> rc1test;但這並沒有幫助。這裏是來源,有沒有人有任何建議?

#include <iostream> 
#include <map> 
#include <string> 
using namespace std; 

template<class T, class BaseClass> 
class RBase : public BaseClass 
{ 
public: 
    typedef int (T::*GetFP)(void) const; 

protected: 
    std::map<const char*, GetFP> mGetFPs; 

}; 

class CBase 
{ 

}; 

template<class PropertyOwner> 
class RC1; 

template<class PropertyOwner=RC1> 
class RC1 : public RBase<PropertyOwner, CBase> 
{ 
public: 
    int int1(void) const 
    { 
    return 1; 
    } 

    RC1() 
    { 
    mGetFPs.insert(pair<const char*, GetFP>("RC1I1I", &PropertyOwner::int1)); 
    }; 

    virtual void inspection(void) 
    { 
    int test = 0; 
    } 
}; 

class RC2 : public RC1<RC2> 
{ 
public: 
    int int2(void) const 
    { 
    return 2; 
    } 

    RC2() 
    { 
    mGetFPs.insert(pair<const char*, GetFP>("RC2I2I", &RC2::int2)); 
    }; 

    virtual void inspection(void) 
    { 
    int test = 0; 
    } 
}; 

int main(void) 
{ 
    RC1<RC1> rc1test; 

    RC2 rc2test; 
    rc2test.inspection(); 

    return(0); 
} 
+0

要讓Stackoverflow將文本視爲代碼,請在每行之前添加四個空格。 – fbrereto 2011-03-02 19:19:55

+0

要在stackoverflow上格式化代碼,只需縮進四個空格。或者粘貼一些代碼,突出顯示它,然後按下'{}'按鈕。 – aschepler 2011-03-02 19:19:59

+0

完成:-)要查看未格式化的版本,請單擊編輯。 – TonyK 2011-03-03 15:34:25

回答

1

如果你可以使用boost,那麼你可以使用boost :: function和boost :: bind來獲得你想要的指針。

template <typename BC> 
    class RBase : public BC 
    { 
    public: 
     typedef int FunctionSignature (void) const; 
     typedef boost::function<FunctionSignature> CallbackFunction; 
    protected: 
     std::map<const char*, CallbackFunction> mGetFPs; 
    }; 

    class CBase 
    { 
    }; 

    class RC1 : public RBase<CBase> 
    { 
    public: 
     RC1() 
     { 
      mGetFPs.insert (std::make_pair ("RC1I1I", 
               boost::bind (&RC1::int1, this))); 
     } 
     int int1(void) const { return 1; } 
    }; 


    class RC2 : public RC1 
    { 
    public: 
     RC2() 
     { 
      mGetFPs.insert (std::make_pair ("RC2I2I", 
               boost::bind (&RC2::int2, this))); 
     } 
     int int2(void) const { return 2; } 
    }; 

其實,你可以分配具有升壓::功能合適簽名的任何功能,甚至使用boost ::綁定,以適應有額外的參數(見下文)的功能。

class RC3 : public RC1 
    { 
    public: 
     RC3() 
     { 
      mGetFPs.insert (std::make_pair ("RC3I3I", 
               boost::bind (&RC3::intN, this, 3))); 
     } 
     int intN(int n) const { return n; } 
    }; 
+0

爲什麼在「boost :: bind(&RC3 :: intN,this,3)」中有3個?我以爲3是爲了多少參數? – jack 2011-03-03 19:42:45

+0

實際上,綁定中的「3」是當mGetFPS [「RC3I3I」]。second()被調用時將作爲參數傳遞給intN的值。這是一個例子,你如何實際使用boost :: bind來修改一個函數的額外參數在它的簽名中。我猜「3」的價值是不幸的。 – vicki 2011-03-03 20:03:42

1
template<class PropertyOwner=RC1> 
class RC1 /*...*/; 

如果沒有爲模板類型參數PropertyOwner默認參數,它需要一個類型。 RC1而不是類型。它是一個類模板。

+0

對於代碼的上下文,您有什麼建議可能是一種很好的類型?我認爲它會將RC1視爲一種類型。 – jack 2011-03-02 19:47:36