Шаблоны C ++ - Указание типа контейнера и того типа контейнера, который он содержит - PullRequest
1 голос
/ 11 августа 2010

Я хочу иметь возможность создать функцию, в которой я указываю параметр, который будет иметь шаблонный контейнер и тип шаблонного элемента для этого контейнера. Это возможно? Я получаю "ошибку C2988: неописуемое объявление / определение шаблона" среди других. Вот эта функция.

template<class Iter, class Elem>
 void readIntoP(Iter<Elem> aCont){
ifstream ifss("data.dat");
string aString;
int counter = 0;
item tempItem;
while(ifss >> aString){
    istringstream iss(aString);
    if(counter == 0){
        tempItem.name = aString;
    }else if(counter == 1){
        int aNum = 0;
        iss >> aNum;
        tempItem.iid = aNum;
    }else{
        double aNum = 0;
        iss >> aNum;
        tempItem.value = aNum;
        aCont.push_back(tempItem);
        counter = -1;
    }
    ++counter;
   }
 }

1 Ответ

4 голосов
/ 11 августа 2010

Вам потребуется использовать параметр шаблона шаблона, например,

template <template <class> class Iter, class Elem>
void readIntoP(Iter<Elem> aCont) { /* ... */ }

Однако обратите внимание, что контейнеры стандартной библиотеки принимают несколько параметров шаблона (например, vector принимает два: один для сохраняемого типа значения и один для используемого распределителя).

Вместо этого вы можете использовать один параметр шаблона для экземпляра типа контейнера, а затем использовать его value_type typedef:

template <typename ContainerT>
void readIntoP(ContainerT aCont)
{
    typedef typename ContainerT::value_type ElementT;
    // use ContainerT and ElementT
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...