Если у меня есть шаблон класса, определенный как:
#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)
{
return /*...*/;
}
Обратите внимание, что template
ключевое слово появляется дважды, сначала для параметров шаблона A
, то для параметров вложенного класса B
,
Вы можете сделать это следующим образом:
template <class T>
template <int CNT>
int A<T>::B<CNT>::doSomething(int in)
{
// do something
}