Обычно я объявляю свои классы и шаблоны, а затем определяю их методы (конечно, в том же файле заголовка). Мне просто так легче читать. Что ж, я столкнулся со случаем, когда я не могу определить сигнатуру рабочего типа для использования во внеклассном определении. Вот' Это упрощенный пример того, что я делаю, который иллюстрирует проблему:
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, и когда один передает пару итераторов. Код работает нормально, если шаблонный конструктор определен внутри основного шаблона, как в настоящее время делает код, но я бы предпочел переместить определение за пределы объявления.
EDIT: Я должен упомянуть, что я не может просто повторно использовать enable_if <...> в определении, потому что enable_if <...> присваивает значение по умолчанию для его типа, чего нельзя сделать в определении, которое также не является объявлением.