Здравствуйте!
Не компилируется пример из книги "Thinking in C++".
Компилятор VC6.
Такой код
//: C06:PrintSequence.h
// From "Thinking in C++, Volume 2", by Bruce Eckel & Chuck Allison.
// (c) 1995-2004 MindView, Inc. All Rights Reserved.
// See source code use permissions stated in the file 'License.txt',
// distributed with the code package available at www.MindView.net.
// Prints the contents of any sequence.#ifndef PRINTSEQUENCE_H
#define PRINTSEQUENCE_H
#include <algorithm>
#include <iostream>
#include <iterator>
template<typename Iter>
void print(Iter first, Iter last, const char* nm = "",
const char* sep = "\n",
std::ostream& os = std::cout) {
if(nm != 0 && *nm != '\0')
os << nm << ": " << sep;
typedef typename
std::iterator_traits<Iter>::value_type T;
std::copy(first, last,
std::ostream_iterator<T>(std::cout, sep));
os << std::endl;
}
#endif// PRINTSEQUENCE_H ///:~
должен отпечатать вектор — ошибки компиляции (и с родным СТЛ-ем и с СТЛ-Портом).
Путём обрезания установлено, что даже
template<typename Iter>
void print(Iter first, Iter last, std::ostream& os, const char* sep = "\n")
{
typedef typename std::iterator_traits<Iter>::value_type T;
// std::copy(first, last, std::ostream_iterator<T>(std::cout, sep));
os << std::endl;
}
похоже дело в том, что в твоей системе итератор для вектора является указателем и для структуры iterator_traits нет специализации для указателя.
Re[2]: std::iterator_traits<Iter>::value_type
От:
Аноним
Дата:
19.08.04 07:52
Оценка:
Здравствуйте, Glоbus, Вы писали:
G>Здравствуйте, Аноним, Вы писали:
G>Хм...похоже ваще на какую-то ошибку компилятора G>Не совсем понятно зачем ты тут iterator_traits юзаешь
Это не я его юзаю — в книге пример такой был...
G> — можно как мне кажется упростить до вот такого
собственно — я закомментировал СОРУ — чтобы выделить проблему — потому что вопрос с ostream_iterator-ом который я задавал чуть раньше так и не был решён...
G>
G>template<typename Iter>
G>void print(Iter first, Iter last)
G>{
G> std::copy(first, last, std::ostream_iterator<typename Iter::value_type>(std::cout, "\n"));
G> std::cout << std::endl;
G>}
G>
G>Прадва вижы 6-е и такое тоже не хавают
А кто хавает? Переносить всё на другой компилятор? На какой?
или может есть какое-то решение для вэцэ6?
Re[2]: std::iterator_traits<Iter>::value_type
От:
Аноним
Дата:
19.08.04 07:53
Оценка:
Здравствуйте, korzhik, Вы писали:
K>Здравствуйте, Аноним, Вы писали:
А>>Компилятор VC6. А>>PS. Для теста: безбожно порезав пример — можно получить — в самом простом виде... А>>
Здравствуйте, Аноним, Вы писали:
K>>похоже дело в том, что в твоей системе итератор для вектора является указателем и для структуры iterator_traits нет специализации для указателя.
А> видимо да ... и как мне быть? что изменить?
Надо добавить специализацию структуры iterator_traits для указателей и для указателей на константу
это называется частичная специализация по виду аргумента шаблона.
VC 6.0 не поддерживает частичную специализацию.
Как быть не знаю. Возможно есть какой-нибудь трюк.
Re[4]: std::iterator_traits<Iter>::value_type
От:
Аноним
Дата:
19.08.04 08:19
Оценка:
Здравствуйте, Glоbus, Вы писали:
G>Здравствуйте, Аноним, Вы писали:
А>> видимо да ... и как мне быть? что изменить?
G>Можно ручками самому напистьа специализвцию для указателей. Хотя ваще странно что в 6-х вижах такого нету. G>Вот из мсдн например код
G>
Здравствуйте, korzhik, Вы писали:
K>Надо добавить специализацию структуры iterator_traits для указателей и для указателей на константу K>это называется частичная специализация по виду аргумента шаблона. K>VC 6.0 не поддерживает частичную специализацию. K>Как быть не знаю. Возможно есть какой-нибудь трюк.
А>А нельзя ли подробней — что делать-то? Куда это писать, для кого, что доопределять...
Собственно вышеприведеднный код можешь прямо целиком без изменений вставить в какой-нить h-файл. То есть если посмотреть на него то можно видеть что в терминах итератора как указателя value_type который тебе нужен определячется через тип, которым параметризуется шаблон, ну и т.д.
Здравствуйте, korzhik, Вы писали:
K>Здравствуйте, korzhik, Вы писали:
K>>Надо добавить специализацию структуры iterator_traits для указателей и для указателей на константу K>>это называется частичная специализация по виду аргумента шаблона. K>>VC 6.0 не поддерживает частичную специализацию. K>>Как быть не знаю. Возможно есть какой-нибудь трюк.
K>как всегда в boost'е нашлось решение: K>
Здравствуйте, KoY, Вы писали:
KoY>Благодарю.
это ты зарегистрировался что-ли? Молодец.
KoY>Однако — будет ли Буст успешно работать с ВэЦэ6?
какие-то библиотеки из boost'а будут работать, какие-то нет.
пример который я дал будет.
А>>А нельзя ли подробней — что делать-то? Куда это писать, для кого, что доопределять...
G>Собственно вышеприведеднный код можешь прямо целиком без изменений вставить в какой-нить h-файл. То есть если посмотреть на него то можно видеть что в терминах итератора как указателя value_type который тебе нужен определячется через тип, которым параметризуется шаблон, ну и т.д.