2015-05-18 3 views
2

мне нужно передать класс шаблона в качестве параметра в функцию, но я могу извлечь имя типа внутри функции для инициализации временных переменнойC++ Передача класса tempate TypeName в качестве параметра функции

класс объявлен следующим образом:

template <typename Type> class ListIndex_Linked 

вот inicialization класса в основной и вызов функции

ListIndex_Linked<std::string> L; 
insertion(L); 

и то, что я пытаюсь сделать

template <class list <typename Type>> 
void insertion(list<Type>& L) 
{ 
    Type& temp = L.get(0); 
    { 
     int max = L.numElem(); 
     for (int i = 1, ; i < max; i++) 
     { 

     } 
    } 
} 

, но я получаю эту ошибку:

error: 'list' is not a template 
void insertion(list<Type>& L) 
      ^

заранее спасибо за помощь

ответ

4

Вы не заявляющего list как template template parameter правильно.

template <template <typename> class list, typename Type> 
void insertion(list<Type>& L) 
{ 
    ... 
} 

Ссылка: http://en.cppreference.com/w/cpp/language/template_parameters

+0

Я вижу, это было очень просто, спасибо, я пробовал различные комбинации с шаблоном и typename, но без успеха –

+0

@FernandoPereira Вы можете видеть [это] (http://en.cppreference.com/w/cpp/language/template_parameters) для получения дополнительной информации. – songyuanyao

3

Если insertion только предполагается работать с ListIndex_Linked, то вы можете записать его в качестве шаблона в терминах если параметр шаблона списка:

template <typename Type> 
void insertion(ListIndex_Linked<Type>& L) 
{ 
    ... 
} 

В противном случае вы можете использовать шаблон templa т.е параметры:

template<template<class> class List, class Type> 
void insertion(const List<Type>& L) 
{ 
    ... 
} 
+0

нет у меня есть 3 других классов, которые работают с введением, я делал это раньше, и работал, но не то, что мне нужно –

+0

@FernandoPereira Но это не в вашем вопросе. Вы можете использовать параметры шаблона шаблона. Я добавил пример. – juanchopanza

+0

Вы правы моя ошибка Я буду более конкретным в будущих вопросах, спасибо –

1

Другим способом является использование auto не санкционировать Type:

template <typename Container> 
void insertion(Container& L) 
{ 
    auto& temp = L.get(0); 
    { 
     int max = L.numElem(); 
     for (int i = 1, ; i < max; i++) 
     { 

     } 
    } 
} 

Существует также typedef внутри Container, которые могут помочь, что-то вроде

typename Container::reference temp = L.get(0); // or Container::value_type& 

который требует что-то вроде:

template <typename Type> 
class ListIndex_Linked 
{ 
public: 
    using value_type = Type; 
    using reference = Type&; 
    // ... 
    // Your code 
}; 
+0

Интересное решение, попробует в следующий раз посмотреть, как это работает, спасибо! –

Смежные вопросы