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

时间:2014-03-13 21:07:33

标签: c++ templates c++11

如果我将模板类定义为:

#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解决方案对其他人有好处。

2 个答案:

答案 0 :(得分:6)

您可以通过以下方式完成此操作:

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

答案 1 :(得分:4)

不确定这是否是您要求的,但我想您需要这样的事情:

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

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