2010-08-08 3 views
3

Я пытаюсь написать функцию для« подбора »параметров для целей ведения журнала. Например, я хотел бы написать что-то вроде этого:C++ function template компилирует ошибку "" containerType 'не является шаблоном "

vector<string> queries; 
set<uint_8> filters; 
LOG(INFO) << stringify<vector, string>(queries); 
LOG(INFO) << stringify<set, uint_8>(filters); 

Вот шаблон функции я писал:

template <typename containerType, typename elemType> 
string _stringify(const string name, const containerType<elemType> &elems) { 
    ostringstream os; 
    os << name << ": ["; 
    BOOST_FOREACH(elemType elem, elems) { 
     os << elem << ",";  
    } 
    os << "]"; 
    return os.str(); 
} 

Вот сообщение об ошибке я получил: error: ‘containerType’ is not a template

Спасибо, Alex

ответ

9

Необходимо использовать параметр шаблона шаблона, например

template <template <typename> class containerType, typename elemType> 
string _stringify(const string name, const containerType<elemType>& elems) 

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

Возможно, проще (и лучше) использовать typedef , который имеет все контейнеры. Например,

template <typename ContainerT> 
void f(const ContainerT& c) 
{ 
    typedef typename ContainerT::value_type ElementT; 
    // Use ContainerT and ElementT 
} 
+1

+1 для 'value_type'. –

+0

Спасибо, Джеймс, это прекрасный ответ. Гораздо чище. Благодарю. –

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