如何区分子模板类的定义和声明

How to separate definition and declaration of child template class

本文关键字:定义 声明 何区      更新时间:2023-10-16

如果我有一个模板类定义为:

#ifndef A_HPP
#define A_HPP
template<class T>
class A
{
public:
  int doSomething(int in, bool useFirst);
private:
  template<int CNT>
  class B
  {
  public:
    int doSomething(int in);
  };
  B<2> first;
  B<3> second;
};
#include "a_imp.hpp"
#endif

现在我可以在实现头文件中为A::doSomething声明如下

#ifndef A_IMP_HPP
#define A_IMP_HPP
template<class T>
int A<T>::doSomething(int in, bool useFirst)
{
  if (useFirst)
    return first.doSomething(in);
  return second.doSomething(in);    
}
#endif

然而,我不知道如何为子类的方法进行声明。这是可能的吗?或者我必须做另外两种我能想到的方法之一,即在主头文件中定义方法或在a之外声明类。

请注意,我使用的是c++ 11,所以如果这只是可行的,它仍然会为我工作,虽然一个c++ 98的解决方案会对其他人很好。

你可以这样做:

template <class T>
template <int CNT>
int A<T>::B<CNT>::doSomething(int in)
{
    // do something
}

不确定这是否是你想要的,但我猜你需要这样的东西:

 template<class T>
 template<int CNT>
 int A<T>::B<CNT>::doSomething(int in)
 {
    return /*...*/;
 }

注意,template关键字出现了两次,首先是A的模板参数,然后是嵌套类B的参数。