Я все еще учусь использовать вариативные шаблоны. По сути, я хочу взять STLContainer
, который содержит элементы типа String
. Контейнер STL не принимает фиксированное количество параметров, поэтому я попытался использовать вариативный шаблон. Если я правильно понял, то должен написать так:
/* Take a container of String and return a string of those elements separated by commas.*/
template < template <typename String, typename ... Traits > class STLContainer >
String as_comma_list(const STLContainer<String, Traits> &container)
{
String result;
for (auto it = container.begin(); it != container.end(); it++)
{
result += *it;
result += ",";
}
result.pop_back(); // pop last comma
return result;
}
Однако компилятор (Apple LLVM version 8.1.0
) выдает:
error: use of undeclared identifier 'Traits'
Буду признателен за любую оказанную помощь.
Редактировать: в конечном итоге я выбрал ответ @Pixelchemist, поскольку он кажется наиболее «универсальным» решением и дает представление о моем коде. Однако я хотел бы сказать, что ответ @Walter одинаково хорош. Хотя ответ @max66 был самым простым, который устранил проблему, исходная проблема заключалась в том, что я пытался ошибочно описать контейнер STL.
Traits
не является типом; это пакет параметров. Вам необходимо расширить пакет параметров:STLContainer<String, Traits...>
- person Justin   schedule 15.09.2017Traits
был не в списке аргументов шаблонаSTLContainer
, аas_comma_list
- person Justin   schedule 15.09.2017container<type,traits...>
. Рассмотримstd::map<key,T,compare,alloc>
, у которого естьvalue_type=std::pair<key,T>
... - person Walter   schedule 16.09.2017