Здравствуйте, Marty, Вы писали:
M>Здравствуйте!
M>
M>
Ну наброс же чистой воды =) Там вся суть ошибки в первых трёх строчках написана, а дальше идёт расшифровка. Чем это принципиально отличается от stack trace в Java или Python? Разве что тем, что тут всё происходит во время компиляции.
В Beatles играло три с половиной человека — Леннон, Харрисон, Старр и пол-МакКартни.
Во-во! А в остальных языках все в свое время ждали этих ваших генериков (тьфу ты, темплейтов), не зная, что их ждет
Здравствуйте, cppguard, Вы писали:
C>Ну наброс же чистой воды =) Там вся суть ошибки в первых трёх строчках написана, а дальше идёт расшифровка. Чем это принципиально отличается от stack trace в Java или Python? Разве что тем, что тут всё происходит во время компиляции.
Спасибо, капитан, я и без тебя знал, что что-то пошло не так при вызове makeString
У меня в проекте есть иерархия шаблонных классов (с десяток параметров у шаблона), и зависимые шаблонные классы, которые используют юзинги/тайпдефы из основной иерархии, и все параметры шаблона, кроме первого, задаются по умолчанию.
Потом мне понадобилось встрваить некоторый юзер контекст класс как параметр шаблона, при этом он важен, и он стал вторым параметром. Я всё вроде отрефакторил, но видимо где-то забыл, и в итоге InputIteratorType стал не пойми чем.
Было типа такого:
template<
class CharT,
class Traits = std::char_traits<CharT>,
class Allocator = std::allocator<CharT>
> class basic_string
{
using value_type = CharT;
using traits_type = Traits;
using allocator_type = Allocator;
// ...
}
На basic_string::using'и завязаны производные и зависимые классы.
Отрефакторил в такое:
template<
class CharT,
class UserContext = void*,
class Traits = std::char_traits<CharT>,
class Allocator = std::allocator<CharT>
> class basic_string;
Ну и где-то что-то недорефакторил, где-то сдвиг произошел, где-то нет, в итоге в конечном коде InputIteratorType стал какой-то хренью, и ожидаемо не собирается.
От компилятора хотелось внятного сообщения, где что не так, а не хтоническая портянка, не влезающая на экран ни по горизонтали, ни по вертикали.
ЗЫ От адептов голенькой сишечки хотелось бы кстати узнать, как вы делаете тот же
basic_string с параметризацией типом символа, его трайтсами (ок, можно без них), и аллокатором?
Здравствуйте, Marty, Вы писали:
M>Спасибо, капитан, я и без тебя знал, что что-то пошло не так при вызове makeString
Там не просто "что-то не так", а сказано, что нет перегрузки для переданных типов.
M>У меня в проекте есть иерархия шаблонных классов (с десяток параметров у шаблона), и зависимые шаблонные классы, которые используют юзинги/тайпдефы из основной иерархии, и все параметры шаблона, кроме первого, задаются по умолчанию.
M>Потом мне понадобилось встрваить некоторый юзер контекст класс как параметр шаблона, при этом он важен, и он стал вторым параметром. Я всё вроде отрефакторил, но видимо где-то забыл, и в итоге InputIteratorType стал не пойми чем.
Видимо, в этом причина, а не в плохом формате вывода ошибок? Если уж так любишь С++, то почему не перейти на концепты?
M>От компилятора хотелось внятного сообщения, где что не так, а не хтоническая портянка, не влезающая на экран ни по горизонтали, ни по вертикали.
То есть ты ожидаешь, что компилятор должен догадаться, что ты хотел? На ЛОРе в этом случае шутят, что libastral не подключён.
M>ЗЫ От адептов голенькой сишечки хотелось бы кстати узнать, как вы делаете тот же basic_string с параметризацией типом символа, его трайтсами (ок, можно без них), и аллокатором?
Да никак, давно уже везде или ANSI, или UTF-8. Вот эти вот все "а давайте мы всё сделаем параметром, потому что вдруг нашу библиотеку придётся портировать на марсианский компьютер, где троичная логика и 21-бит на символ" не работают. Ирония заключается в том, что голая сишечка отлично портируется на утюги и фены Дайсон, а С++ может не собраться, просто потому что версия компилятора не понравилась.