инстанцирование шаблона
От: kodermax  
Дата: 03.05.11 19:40
Оценка:
Есть шаблонная очередь с использованием vector
Как инстанцировать для своего класса, представляющего строку, изготовленную из vector<char>?
template <class T> class mydeque {
protected:
       vector<T> first; //первый вектор - используется для вставки в начало очереди
       vector<T> second; //второй вектор - используется для вставки в конец очереди
public:
       mydeque()
       {
       };
       ~mydeque()
       {
       };
   void shift(const T& val)  // функция добавления элемента в начало очереди
   {
       first.push_back(val);
   }
   void push(const T& val)  //функция добавления элемента в конец очереди
   {
       second.push_back(val);
   }
   void print() 
   {
       vector<T>::iterator cur;
       for (cur=first.begin();cur<first.end();cur++)
       cout<<*cur;
       for (cur=second.begin();cur<second.end();cur++)
       cout<<*cur;
   }
private:
};
Re: инстанцирование шаблона
От: okman Беларусь https://searchinform.ru/
Дата: 03.05.11 21:22
Оценка:
Здравствуйте, kodermax, Вы писали:

K>Есть шаблонная очередь с использованием vector

K>Как инстанцировать для своего класса, представляющего строку, изготовленную из vector<char>?
K>
K>template <class T> class mydeque {
K>protected:
K>       vector<T> first; //первый вектор - используется для вставки в начало очереди
K>       vector<T> second; //второй вектор - используется для вставки в конец очереди
K>public:
K>       mydeque()
K>       {
K>       };
K>       ~mydeque()
K>       {
K>       };
K>   void shift(const T& val)  // функция добавления элемента в начало очереди
K>   {
K>       first.push_back(val);
K>   }
K>   void push(const T& val)  //функция добавления элемента в конец очереди
K>   {
K>       second.push_back(val);
K>   }
K>   void print() 
K>   {
K>       vector<T>::iterator cur;
K>       for (cur=first.begin();cur<first.end();cur++)
K>       cout<<*cur;
K>       for (cur=second.begin();cur<second.end();cur++)
K>       cout<<*cur;
K>   }
K>private:
K>};
K>


Как инстанцировать ? Да как обычно (обратите внимание на пробел между закрывающими угловыми скобками):

mydeque<vector<char> > Deque;


Только строку vector<T>::iterator cur в методе print нужно дополнить ключевым словом typename:

typename vector<T>::iterator cur;
Re[2]: инстанцирование шаблона
От: kodermax  
Дата: 04.05.11 07:31
Оценка:
Здравствуйте, okman, Вы писали:

O>Здравствуйте, kodermax, Вы писали:


K>>Есть шаблонная очередь с использованием vector

K>>Как инстанцировать для своего класса, представляющего строку, изготовленную из vector<char>?
K>>
K>>template <class T> class mydeque {
K>>protected:
K>>       vector<T> first; //первый вектор - используется для вставки в начало очереди
K>>       vector<T> second; //второй вектор - используется для вставки в конец очереди
K>>public:
K>>       mydeque()
K>>       {
K>>       };
K>>       ~mydeque()
K>>       {
K>>       };
K>>   void shift(const T& val)  // функция добавления элемента в начало очереди
K>>   {
K>>       first.push_back(val);
K>>   }
K>>   void push(const T& val)  //функция добавления элемента в конец очереди
K>>   {
K>>       second.push_back(val);
K>>   }
K>>   void print() 
K>>   {
K>>       vector<T>::iterator cur;
K>>       for (cur=first.begin();cur<first.end();cur++)
K>>       cout<<*cur;
K>>       for (cur=second.begin();cur<second.end();cur++)
K>>       cout<<*cur;
K>>   }
K>>private:
K>>};
K>>


O>Как инстанцировать ? Да как обычно (обратите внимание на пробел между закрывающими угловыми скобками):


O>
O>mydeque<vector<char> > Deque;
O>


O>Только строку vector<T>::iterator cur в методе print нужно дополнить ключевым словом typename:


O>
O>typename vector<T>::iterator cur;
O>



И тогда перестаёт работать print
Re[3]: инстанцирование шаблона
От: wander  
Дата: 04.05.11 09:19
Оценка:
Здравствуйте, kodermax, Вы писали:

K>И тогда перестаёт работать print


Правильно перестает. Потому что нет оператора << для std::vector<>.

Можно добавить нечто такое и все заработает.
#include <iterator>

template <class T>
std::ostream & operator<<(std::ostream & out, std::vector<T> const & x)
{
    std::copy(x.begin(), x.end(), std::ostream_iterator<T>(out, " "));
    return out;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.