Я обычно объявляю свои классы и шаблоны, а затем определяю их методы (в том же заголовочном файле, конечно).Мне просто легче читать таким образом.Ну, я сталкивался со случаем, когда я не могу определить сигнатуру рабочего типа для использования в определении вне класса.Вот упрощенный пример того, что я делаю, который иллюстрирует проблему:
template <class T>
struct Foo
{
Foo(T a, T b);
template
< class Iterator
, enable_if< is_iterator<Iterator> >
>
Foo
( Iterator first
, Iterator last
);
};
template <class T>
Foo<T>::Foo(T a, T b)
{ ... }
template <class T>
template
< class U
, WHAT_GOES_HERE?
>
Foo<T>::Foo(U f, U l)
{ ... }
Я попытался несколько вещей в слоте WHAT_GOES_HERE
, чтобы попытаться получить соответствующую подпись, и я продолжаю терпеть неудачу,Мне нужен enable_if, чтобы различить случай, когда один передается в двух объектах типа T, и когда один передается в паре итераторов.Код работает нормально, если шаблонный конструктор определен внутри основного шаблона, как это делает код в настоящее время, но я бы предпочел переместить определение за пределы объявления.
РЕДАКТИРОВАТЬ: Я должен отметить, что я не могу просто повторно использовать enable_if <...> в определении, потому что enable_if <...> назначает значение по умолчанию для его типа, что вы не можете сделать в определении, которое также не являетсядекларация.