由於我不想重新定義方法,我想使用泛型,因此我遇到了模板專門化的問題。如何避免在模板專業化中重新定義類方法?
template<class VarsContainer, class Specific>
class State
{
public:
State();
~State(){}
HSError_t Update(LoggerData const &lData);
VarsContainer state;
void swap(State &rhs);
State & operator=(State rhs); // pass by value copy
protected:
void UpdateSpecific(Specific *rhs);
Specific specificPtr;
};
並在實施我做到以下幾點:
template<class VarsContainer, class Specific>
HSError_t State<VarsContainer, Specific>::Update(LoggerData const &lData)
{
HSError_t error_t = HeatInterfaceError;
specificPtr = const_cast<Specific>(&lData);
error_t = UpdateSpecific(specificPtr);
if(error_t != HeatSuccess)
{
return error_t;
}
return error_t;
}
template<class VarsContainer, class Specific>
HSError_t State<VarsContainer, Specific>::UpdateSpecific(Specific *rhs)
{
HSError_t error_t = HeatInterfaceError;
return error_t;
}
這樣做,我專注於以下方式模板後:
template<>
class State<ChemicalVars, Chemicals*>
{
public:
ChemicalVars state;
protected:
HSError_t UpdateSpecific(Chemicals *chemicals);
Chemicals *specificPtr;
};
而且我在一個CPP文件中定義UpdateSpecific將數據從專用結構複製到本地狀態。
問題是,當我嘗試調用「Update」方法時,編譯器沒有在我的ChemicalVars的專門模板中爲它創建一個定義。
後來,我改變我的專長有:
template<>
class State<ChemicalVars, Chemicals*>
{
public:
ChemicalVars state;
HSError_t Update(LoggerData const &lData);
protected:
HSError_t UpdateSpecific(Chemicals *chemicals);
Chemicals *specificPtr;
};
但儘管如此,錯誤是一樣的:
undefined reference to `State<ChemicalVars, Chemicals*>::Update(LoggerData const&)'
問題是通用的實現是不錯的,我只是想用定義的在專業化使用的通用國家。
似乎是一個很好的解決方法,非常感謝你大衛。將立即着手並在幾分鐘內發佈解決方案。 – Claudiordgz