Пытался я откомпилять код cl-ем, который успешно компилялся gcc-ой.
cl выдаёт такую вот занимательную ошибку:
a.cpp(10) : error C2784: 'std::reverse_iterator<_RanIt> std::operator +(_Diff,const std::reverse_iterator<_RanIt> &)' : could not deduce template argument for 'const std::reverse_iterator<_RanIt> &' from 'const char [6]'
если разкомментарить выделенное, то есс-но всё ок.
Вопрос в том, почему так не компиляется то???
bcc сжевал молча
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>Если ты хочешь использовать строку, то есс-но ты должен включать заголовок <string>, а не надеяться на то, что он будет включен где-то кем-то еще.
Да всё понятно, меня сильно смутила ошибка.
Если бы мне компайлер сказал "не знаю что за хрень — std::string", а
он бутор какой-то выдал.
Стандартом не оговорено, какие стандартные заголовки должны включаться в другие стандартные заголовки. Так что конкретные реализации могут отличаться в этом плане.
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, e-Xecutor, Вы писали:
B>Стандартом не оговорено, какие стандартные заголовки должны включаться в другие стандартные заголовки. Так что конкретные реализации могут отличаться в этом плане.
Это всё понятно. Мне непонятены странные маты компилятора.
Ага... Уже понятны. Блин.
stdexcept инклудит xstring.
а в нём нет шаблонных operator+, они лежат в string.
Вот ведь #@$%@#$%....
И вообще ты довольно таки цинично опустил еще часть сообщения
D:\ld\main.cpp(8) : error C2676: binary '+' : 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' does not define this operator or a conversion to a type acceptable to the predefined operator
Error executing xicl6.exe.
Если залезть в <stdexcept>, то видно, что он включает <xstring>, тот содержит определение basic_string, но там нет оператора +.Зато через кучу других инклудов включен файл, содержащий operator + для итераторов, <utility>. Разумеется, он не подходит, о чем и сообщил cl
Of course, the code must be complete enough to compile and link.
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>И вообще ты довольно таки цинично опустил еще часть сообщения
L_L>
L_L>D:\ld\main.cpp(8) : error C2676: binary '+' : 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' does not define this operator or a conversion to a type acceptable to the predefined operator
L_L>Error executing xicl6.exe.
L_L>Если залезть в <stdexcept>, то видно, что он включает <xstring>, тот содержит определение basic_string, но там нет оператора +.Зато через кучу других инклудов включен файл, содержащий operator + для итераторов, <utility>. Разумеется, он не подходит, о чем и сообщил cl
Уже докопался...
Ну и кто после этого те, кто так сделал?
Здравствуйте, Lorenzo_LAMAS, Вы писали:
EX>>Уже докопался... EX>>Ну и кто после этого те, кто так сделал? L_L>???????
L_L>Что сделал? Для использования строк нужно включать <string>.
Вместо string заинклудили xstring.
В результате получилось кастрированное определение объекта.
В результате диагностика ошибок компиляции, и без
того не отличающаяся ясностью, выдала ошибку
не имеющую отношения к проблеме.
Оптимизаторы хреновы...
P.S. я не спорю относительно необходимости #include <string>.
Я мысленно крою матом того, кто придумал такой solution.
Я потратил достаточно много времени пытаясь понять что за shit происходит.
Ибо компилялся весьма большой проект, и происходило "это" в дебрях
шаблонного класса. Я же привёл редуцированный до минимальной воспроизводимости пример.
Так началось — то все с простого неправильного использования заголовков. На твое счастье, включался xstring, а если б не он, а string, то ты бы радостно скомпилил, а потом кто-то, использующий твою программу с другим компилятором/другой версией того же компилятора обкладывал бы матами уже тебя.
Of course, the code must be complete enough to compile and link.