Как разделить определение и объявление дочернего шаблона класса

Если у меня есть шаблон класса, определенный как:

#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 было бы хорошо для других людей.

6

Решение

Не уверен, если это то, что вы спрашиваете, но я думаю, вам нужно что-то вроде этого:

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

Обратите внимание, что template ключевое слово появляется дважды, сначала для параметров шаблона A, то для параметров вложенного класса B,

4

Другие решения

Вы можете сделать это следующим образом:

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