0

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

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&)'

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

4

2 回答 2

4

专业化和基本模板的定义在某种程度上是不相关的。专业化不会从基本模板继承任何东西,您必须重新定义您需要的基本模板中的所有功能。

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

于 2013-06-26T15:16:51.380 回答
1

特化一个类模板意味着每当该类使用该特定的特化类型实例化时,它将使用特化的定义。这就是您遇到第一个未定义错误的原因。但是,当您添加了专门的更新功能但没有定义它,而是假设它使用默认功能时,这会导致您收到第二条错误消息,因为它没有按照您的意愿使用默认功能,而是尝试查找专门的更新定义。我认为您想要做的是更多的抽象,如下所示:

//This will hold all function common to template param for State class
template<typename Container, typename Specific>
struct CommonStateDefinition{  
     void Update(StructData const &lData){
         std::cout<<"In CommonStateDefinition::Update" << endl;
     }
};

template<typename Container, typename Specific>
struct State{
    CommonStateDefinition<Container,Specific> m_stateImpl;
    void Update(StructData const &lData){
        std::cout << "In State::Update" << endl;
        m_stateImpl.Update(lData);
    }
}

template<>
class State<ChemicalVars, Chemicals*>{
    CommonStateDefinition<ChemicalVars,Chemicals*> m_stateImpl;
    //use the common update via delegation
    void Update(StructData const &lData){
        std::cout << "In State<ChemicalVars,Chemicals*>::Update" << endl;
        m_stateImpl.Update(lData);
    }
    //add other specialized function
}
于 2013-06-26T15:21:34.003 回答