1

所以我嘗試:如何在子項中指定函數的模板參數?

class data_ppp { 
public: 
    template <class T> 
    virtual boost::shared_ptr<T> getData() 
    { 
     return boost::shared_ptr<T>(new T()); 
    } 
}; 

class data_child : public data_ppp { 
public: 
    template<> 
    getData<std::vector<int>>(); 
}; 

,但不能獲得預期的效果 - 我想在課堂data_child的getData函數將只返回boost::shared_ptr<std::vector<int>>。如何做這樣的事情?

+0

成員函數模板不能是虛擬的:http://stackoverflow.com/questions/2354210/can-a-member-function-template-be-virtual –

+0

你能用C++ 11編譯嗎? – 0x499602D2

回答

1

您的問題,唯一的解決辦法,我現在看到的是:

class data_ppp 
{ 
public: 
    template<class T> 
    std::shared_ptr<T> getData() 
    { return std::shared_ptr<T>(new T()); } 
}; 

class data_child : public data_ppp 
{ 
public: 
    std::shared_ptr<int> getData() 
    { return data_ppp::getData<int>(); } 
}; 

用法:

data_child dc; 
dc.getData(); 
//dc.getData<float>(); // compilation error 
1

根據你的描述。您需要具有不同簽名的新功能。因此,您將在子類中處理此getdata,就好像它的非常不同的函數一樣,因爲返回類型是不同的。

0

會員功能模板(如你的getData())不能是虛擬的。但是,您可以使用虛擬成員函數創建類模板:

template <class T> 
class data_ppp { 
public:   
    virtual boost::shared_ptr<T> getData() 
    { 
     return boost::shared_ptr<T>(new T()); 
    } 
}; 

這允許進行相當多的自定義。

1)你可以定義一個類data_ppp< std::vector<int> >。如果該類需要表現爲通用T,那麼你就完成了。

2)如果要覆蓋特定數據的用途,但所有類型的T行爲,要動態地使用新的功能,你可以從data_ppp<T>

template <class T> 
class data_child: public data_ppp<T> { 
public:  
    virtual boost::shared_ptr<T> getData() 
    { 
     // add logging, printing or whatever you want 
     return boost::shared_ptr<T>(new T()); 
    } 
}; 

3)如果派生你只需要重新定義getData()T等於std::vector<int>,你只需要專門data_ppp

template <> 
class data_ppp< std::vector<int> > { 
    typedef std::vector<int> T; 
public:  
    virtual boost::shared_ptr<T> getData() 
    { 
     // add logging, printing or whatever you want 
     return boost::shared_ptr<T>(new T()); 
    } 
}; 
相關問題