Вы действительно пробовали этот код?Он отлично работает на gcc с небольшой настройкой std::vector<T>::const_iterator
, его необходимо объявить как typename std::vector<T>::const_iterator
. Возможно, вам лучше использовать std :: copy и std :: ostream_iterator.
РЕДАКТИРОВАТЬ: типы, зависимые типы и имя типа Не может вместить все это в комментариях, так что здесь (кстати, это мое понимание, и я мог бы быть на милю страны - если так, пожалуйста, поправьте меня!) ...
Я думаю, это лучше всего объяснить на простом примере ..
Предположим, у вас есть функция foo
template <typename T>
void foo()
{
T::bob * instofbob; // this is a dependent name (i.e. bob depends on T)
};
Выглядит хорошо, и обычно выможет сделать это
class SimpleClass
{
typedef int bob;
};
и позвонить
foo<SimpleClass>(); // now we know that foo::instofbob is "int"
Опять же, кажется самоочевидным, однако приходит какой-то nuser и делает это
class IdiotClass
{
static int bob;
};
Теперь
foo<IdiotClass>(); // oops,
Теперь у вас есть выражение (умножение), поскольку IdiotClass :: bob преобразуется в нетип!
Для человека очевидно, что это глупо, но компилятор не имеетспособ отличить типы от не-типов, и по умолчанию в C ++ (и я думаю, что это гдеразличаются), все квалифицированные зависимые имена (т. е. T :: bob) будут обрабатываться как не тип .Чтобы явно сообщить компилятору, что зависимое имя является вещественным типом, необходимо указать ключевое слово typename
-
template <typename T>
void foo()
{
typedef typename T::bob *instofbob; // now compiler is happy, it knows to interpret "bob" as a type (and will complain otherwise!)
};
Это применимо, даже если это typedef
.то есть
template <typename T>
void foo()
{
typedef typename T::bob local_bob;
};
Это понятнее?