Есть несколько вещей, которые вам нужно понять. Компилятор действительно делает все возможное; он сообщает вам, где именно это произошло, и весь сборник до этой точки. Он не знает, что вы намеревались написать, он знает, что вы написали, так как, возможно, можно предположить, что ошибка была вызвана чем-то еще более удаленным? Я думаю, что если бы вы писали его и доходили до того, что делали ошибки «чище, короче и дружелюбнее», вы бы поняли, что это намного сложнее, чем могло бы показаться.
Бывают ситуации, когда он может это сделать, и компиляторы становятся лучше предлагать им это похоже. Например это:
if (x);
{
x = 5;
}
Выдает предупреждение:
warning C4390: ';' : empty controlled statement found; is this the intent?
Но они не всегда могут сделать это.
Что все сказано, сообщения об ошибках действительно все, что вам нужно для решения проблемы, как только вы немного изучите язык и понимаете, что все это значит. Я думаю, что это огромный миф и преувеличение, что ошибки шаблона являются «злыми и загадочными». Хотя они могут быть многословными, они действительно не так уж трудно понять. Я не думаю, что ошибки шаблона являются загадочными, я думаю, что читатель не знает, как его хорошо читать, что делает его загадочным. Но если вы не торопитесь, вы увидите, что именно он пытался сделать, и где это не удалось.
В следующем стандарте C++ 0x появилась вещь под названием «понятия», которая бы устранила это. Они были похожи на теги, которые могли бы вписаться в классы, если бы они поддерживали все те теги, которые сказали им. Итак, в std::copy
вместо ошибок о том, что вы не можете вызвать operator=
на что-то, наряду с ошибками, которые распространяются, вы просто получите что-то вроде «Ошибка: Тип не CopyAssignable», и это было бы так. Такая же ошибка, различная презентация. И это также причина, по которой они были вырезаны, пока. они оказались неприятностями, и поскольку в любом случае это был синтаксический сахар, более важно работать над другими вещами. Надеюсь, мы увидим их когда-нибудь.
Теперь есть инструмент под названием STLFilt, который будет фильтровать ошибки шаблона относительно вещей в STL. Я никогда не использовал его, но я слышал, что он рекомендовал не раз. Вот один из их sample filters. Вы можете попробовать.
Поскольку вы, кажется, думаете, что это можно сделать на самом языке: nope. Язык не имеет представления о том, какие сообщения об ошибках должны выглядеть или что следует предупреждать или что не должно.
Вы найдете то, что я имею в виду в стандарте в разделе 1.4/2. Подводя итог, в основном говорится: «Если есть ошибка, выведите что-нибудь об этом». Вот и все.
Это кажется невозможным, если вы сами не пишете компилятор. – Jichao
jcyang - Я начинаю думать так же. Сообщения об ошибках, вероятно, устанавливаются программным обеспечением компилятора. – Azoreo