gpt4 book ai didi

c++ - 如何避免在模板特化中重新定义类方法?

转载 作者:太空宇宙 更新时间:2023-11-04 16:20:29 27 4
gpt4 key购买 nike

我在使用模板特化时遇到问题,因为我不想重新定义方法,我想使用通用方法。

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,将数据从专用结构复制到本地状态。

问题是当我尝试调用“更新”方法时,编译器没有在我的 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&)'

问题是通用实现很好,我只想使用通用状态中定义的那个,供特化使用。

最佳答案

特化和基本模板的定义在某种程度上是无关的。特化不会继承基本模板的任何内容,您必须重新定义所需基本模板中的所有函数。

常见的解决方法是将基本模板拆分为一个基类,该基类具有所有专用化通用的所有代码,然后在基本模板和专用化中从那里继承,以便可以重用通用代码。

关于c++ - 如何避免在模板特化中重新定义类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17323813/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com