Компилятор не может узнать, какую специализацию printItem
вы хотели, с информацией, доступной ему в соответствии со стандартом на тот момент.
Таким образом, этот синтаксис здесь недоступен.
Это то, что вам нужно:
for_each(t.begin(), t.end(), printItem<typename T::value_type>);
Возможность делать подобные вещи - именно поэтому контейнеры необходимы для определения псевдонимов типов, таких как value_type
; в конечном итоге они вам нужны повсюду.
Ограничение в языке? Может быть. Но это помогает избежать угловых случаев.
Необходимость использования typename
здесь, безусловно, раздражение .
Ваш код, если честно, было бы намного проще и понятнее, если бы вы просто использовали al oop:
for (const auto& item : t)
printItem(item);
Во времена дальнего радиуса и всего такого прекрасного, for_each
не так уж полезен для обычных случаев. подробнее.
Кроме того, возьмите аргументы по ссылке на const
и удалите ошибочную разыменование. Я также удалю повторное std::endl
, которое выполняет очистку потока, в котором вы не нуждаетесь.
template <class T>
void printItem(const T& t)
{
std::cout << t << '\n';
}
template <class T>
void printVector(const T& t)
{
for (const auto& item : t)
printItem(t);
}
int main()
{
std::vector<std::string> vs = {"word1", "word2"};
printVector(vs);
}
Наконец, неплохо бы, чтобы такие функции, как printItem
, брали ссылку на поток вы хотите использовать, чтобы вы могли выбрать (скажем) std::stringstream
вместо только std::cout
.