У меня есть простой объект, который выполняет некоторые синтаксические разборки. Внутри есть функция синтаксического анализа, содержащая статическую переменную, которая используется для ограничения количества сообщений об ошибках для печати пользователю:
struct CMYParsePrimitive {
static bool Parse(const std::string &s_line)
{
// do the parsing
static bool b_warned = false;
if(!b_warned) {
b_warned = true;
std::cerr << "error: token XYZ is deprecated" << std::endl;
}
// print a warning about using this token (only once)
return true;
}
};
Теперь эти примитивы синтаксического анализа передаются в списке типов для специализации парсера. Существует еще один интерфейс, который сообщает парсеру, какие маркерные типы должны анализироваться с использованием примитивов parse.
Моя проблема заключается в том, что предупреждение должно отображаться до одного раза для запуска приложения. Но в моем случае это иногда отображается несколько раз, кажется, для экземпляра парсера, а не для экземпляра приложения.
Я использую Visual Studio 2008, я думаю, это может быть ошибка или отклонение от стандарта? Кто-нибудь знает, почему это происходит?
Я не заметил, что функция также является шаблоном. Виноват. Он дважды создается в коде с разными параметрами - поэтому предупреждение иногда печатается дважды. Реальный код выглядит следующим образом:
struct CMYParsePrimitive {
template <class CSink>
static bool Parse(const std::string &s_line, CSink &sink)
{
// do the parsing, results passed down to "sink"
static bool b_warned = false;
if(!b_warned) {
b_warned = true;
std::cerr << "error: token XYZ is deprecated" << std::endl;
}
// print a warning about using this token (only once)
return true;
}
};
Итак, есть, например, CMYParsePrimitive::Parse<PreviewParser>::b_warned
, который может печатать предупреждение один раз при использовании PreviewParser
, а затем также CMYParsePrimitive::Parse<Parser>::b_warned
который может печатать предупреждение при использовании Parser
.