Есть несколько вещей, которые вы должны понять. Компилятор действительно делает все возможное; он говорит вам, где именно он потерпел неудачу, и всю компиляцию вплоть до этого момента. Он не знает, что вы намеревались написать, он знает, что вы написали, так как он может предположить, что ошибка была вызвана чем-то более удаленным? Я думаю, что если бы вы писали это и подошли к тому, чтобы делать ошибки «чище, короче и дружелюбнее», вы бы поняли, что это гораздо сложнее, чем может показаться.
Бывают ситуации, когда он может это сделать, и компиляторам кажется, что им лучше предлагать их. Например это:
if (x);
{
x = 5;
}
Выдает предупреждение:
предупреждение C4390: ';' : найдено пустое контролируемое утверждение; это намерение?
Но они не всегда могут это сделать.
Тем не менее, сообщения об ошибках - это действительно все, что вам нужно для решения проблемы, как только вы немного изучите язык и поймете, что все это значит. Я думаю, что это огромный миф и преувеличение, что ошибки шаблона являются «злыми и загадочными». Хотя они могут быть многословными, их на самом деле совсем не сложно понять. Я не думаю, что ошибки шаблона являются загадочными, я думаю, что читатель не знает, как правильно его читать, что делает его загадочным. Но если вы не торопитесь, вы точно видите, что он пытался сделать, и где он потерпел неудачу.
В следующем стандарте, C ++ 0x, должна была появиться вещь, называемая «понятиями», которая очень сильно это исправит. Они были чем-то вроде тегов, в которые могли бы вписаться классы, если бы они поддерживали все, что, по словам тега, они должны были. Таким образом, в std::copy
вместо ошибок, связанных с невозможностью вызова operator=
для чего-либо, наряду с распространяющимися ошибками, вы просто получите что-то вроде «Ошибка: Тип не CopyAssignable», и это будет так. Та же ошибка, другая презентация. И это также причина, по которой их сейчас отключили. они оказались проблемой, и так как это был синтаксический сахар в любом случае, более важно работать над другими вещами. Надеюсь, мы увидим их когда-нибудь.
Теперь есть инструмент под названием STLFilt , который будет фильтровать ошибки шаблона, касающиеся вещей в STL. Я никогда не использовал это, но я слышал, что это рекомендуется не раз. Вот один из их образцов фильтров . Вы можете попробовать.
Поскольку вы, кажется, думаете, что это можно сделать на самом языке: нет. В языке нет понятия о том, как должны выглядеть сообщения об ошибках или что должно предупреждать, а что нет.
Вы найдете то, что я имею в виду в стандарте в разделе 1.4 / 2. Подводя итог, он в основном говорит: «Если есть ошибка, выведите что-нибудь об этом». Вот и все.