On 7/25/06, Sergey B. Khvatov <xbat***@t*****.ru> wrote:
>
> А насчет странных синтаксических ошибок в C++ - изучайте его
> лучше и не стесняйтесь использовать "самоограничивающие"
> конструкции: const, throw, explicit,.. - помогает :-)
>
Я имел в виду диагностики, связанные, например, с разрешением шаблонов
- неоднократно был свидетелем как начинающие программисты на C++
становились в тупик перед каскадом совершенно им непонятных сообщений
- и никакие const и т.п. тут не помогут. Вот коротенький пример:
#include <iostream>
#include <cstdlib>
void qq()
{
return;
}
int main()
{
std::cout << "qq " << qq() << std::endl;
return EXIT_SUCCESS;
}
Ясно, что программист (случайно, наверное - могут быть функции с
похожими именами) пытается вывести значение функции, которая не
возвращает значения. Сообщения компилятора мало того, что обильны и
прямо об этом не говорят, но и у неопытного программиста есть
тенденция ориентироваться на то, что компилятор говорит в самом конце
(компилятор, кстати, gcc 3.3.5)! Ясно, что это безнадёга.
syntax.cpp: In function `int main()':
syntax.cpp:11: error: no match for 'operator<<' in 'std::operator<< [with
_Traits = std::char_traits<char>]((&std::cout), "qq ") << qq()'
/usr/include/c++/3.3/bits/ostream.tcc:63: error: candidates are:
std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT,
_Traits>::operator<<(std::basic_ostream<_CharT,
_Traits>&(*)(std::basic_ostream<_CharT, _Traits>&)) [with _CharT = char,
_Traits = std::char_traits<char>]
[пропущено много строк, понятных только тем, кто знает, что такое
шаблоны и как с ними работают]
/usr/include/c++/3.3/bits/ostream.tcc:512: error:
std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char,
_Traits>&, char) [with _Traits = std::char_traits<char>]
/usr/include/c++/3.3/ostream:436: error:
std::basic_ostream<_CharT, _Traits>&
std::operator<<(std::basic_ostream<_CharT, _Traits>&, char) [with _CharT =
char, _Traits = std::char_traits<char>]
В так называемых "визуальных средах" не пробовал, но думаю, что там
диагностика будет не лучше. Впрочем, попробую, как руки дойдут -
просто интересно.