У меня есть куча контейнеров указателей объектов, которые я хочу перебирать в разных контекстах, чтобы производить их диагностику. Я борюсь с синтаксисом, необходимым для определения функций ... которые из-за фильтрации этих объектов по разным частям моего приложения лучше всего заключаются в специальный класс диагностики, таким образом:
// Code sketch only - detail fleshed out below...
class ObjectListDiagnoser
{
public:
static void GenerateDiagnostics( /* help required here! */ );
};
...
// Elsewhere in the system...
ObjectListDiagnoser::GenerateDiagnostics( /* help required here! */ );
То, что я хотел бы сделать (в некоторых местах моего приложения), это как минимум следующее:
std::vector<MyObject *> objGroup1;
std::list<MyObject *> objGroup2;
ObjectListDiagnoser::GenerateDiagnostics( objGroup1.begin(), objGroup1.end() );
ObjectListDiagnoser::GenerateDiagnostics( objGroup2.begin(), objGroup2.end() );
ObjectListDiagnoser::GenerateDiagnostics( objGroup1.rbegin(), objGroup1.rend() );
Я пытался шаблонировать свою функцию двумя способами, но безуспешно:
class ObjectListDiagnoser
{
public:
// 1 - nope.
template <class ObjIter>
static void GenerateDiagnostics( ObjIter first, ObjIter last );
// 2. - nope.
template <class Container, class ObjIter>
static void GenerateDiagnostics( Container<MyObject *>::ObjIter first,
Container<MyObject *>::ObjIter last );
};
Может ли кто-нибудь предоставить правильный синтаксис для этого? Тип контейнера будет меняться, и направление итерации будет меняться, но всегда для одного и того же типа объекта.
Резюме обсуждения в комментариях ниже - случай 1 верен ... но приводит к широко неразборчивой ошибке компоновщика, если определение функции шаблона отсутствует в заголовке. Определения шаблонных функций просто должны идти в заголовке - точка, которую легко забыть. Вставьте его в шапку, и все хорошо - компилирует, ссылки ... и, надеюсь, даже работает.