Ну, чтобы решить эту небольшую примерную проблему.Это довольно просто.vector<int>
- это класс, поэтому вам не нужно объявлять A<B>
в прототипе.Вы можете просто сделать это:
template<class A>
void myFunction(A& list)
{
typedef typename A::value_type B; //do this if you need to know the type of the elements.
typename A::iterator current = list.begin();
typename A::iterator end = list.end();
while (current != end)
{
current++;
}
}
Но если вам действительно нужно, вы также можете объявить аргумент шаблона как шаблон:
template< template<class> class A, class B >
void myFunction(A<B>& list)
{
typename A<B>::iterator current = list.begin();
typename A<B>::iterator end = list.end();
while (current != end)
{
current++;
}
}
Но вышеприведенное не очень рекомендуетсяи большинство шаблонов классов имеют набор вложенных typedef (например, iterator и value_type в контейнерах STL), так что вы можете получить всю необходимую информацию о типе, не используя эти параметры шаблона шаблона.Таким образом, первый способ обычно является предпочтительным и более обычным способом (обычно также меньше проблем с его выполнением, т. Е. Компилятор склонен «не любить» параметры шаблона).
Кроме того,Вы не можете использовать контейнеры STL очень легко с параметрами шаблона шаблона, потому что все контейнеры STL имеют эти «скрытые» аргументы шаблона (например, «allocator» и «Compare» для отсортированных контейнеров).Таким образом, вам придется перечислить все это, в противном случае компилятор не сможет сделать совпадение.Кроме того, у вас не будет очень «универсальной» функции, потому что вам придется так много полагать о прошедшем контейнере STL, что он будет обслуживать только один или два типа контейнеров.Действительно лучше использовать первый способ.