Lint предупреждения при использовании std :: unary_function

при проверке функтора, который получен из std :: unary_function следующим образом

struct IsInterestingMsg : public std::unary_function<string,bool>

Lint выбрасывает следующую информацию / предупреждения:

1790: Base class 'std::unary_function<std::basic_string<char>,bool>' has no non-destructor virtual functions

а также

Warning 1509: base class destructor for class 'unary_function' is not virtual

В соответствии с Скотт Мейерс, классы функторов должны быть адаптированы путем unary/binary_function которые в основном только коллекция typedefs, таким образом, они не являются классами, которые необходимость любой конструктор / деструктор. Поэтому предупреждения о ворсе как таковые являются правильными.

Кто-нибудь знает, как подавить эти предупреждения глобально и только для всего использования unary_function так далее.? Я хочу избежать написания -e1509 каждый раз, когда он используется.

Информация # 1790 может быть подавлена ​​путем использования частного наследования вместо открытого, но предупреждение # 1509 остается.

0

Решение

Следующее подавление работает для меня:

/*lint -esym(1790, "std::unary_function<*,*>") -esym(1509, unary_function) */

Здесь есть несколько подводных камней:

  • Обратите внимание на кавычки для аргумента esym, поэтому Lint не интерпретирует запятую в списке параметров шаблона
  • Сообщение 1790 параметризовано для «символа» — таким образом, вы должны использовать полное пространство имен при обращении к нему
  • Сообщение 1509, с другой стороны, параметризовано как «Имя», поэтому вы не должны давать ему полное пространство имен.

Что касается того, когда использовать пространство имен и когда его пропускать, просто используйте строку, заключенную в кавычки в сообщении об ошибке Lint, и все должно быть в порядке. Недостатком является то, что, похоже, нет способа отключить 1509 для std :: unary_function, но не для ns :: unary_function.

1

Другие решения

Вздох, Линт должен был узнать, что … Во всяком случае, то, что вы получаете, получая из unary_function, это несколько вложенных typedefs, смотрите http://www.cplusplus.com/reference/functional/unary_function/. Вы можете создать их самостоятельно, а не наследовать.

Другим способом было бы условно объявить виртуальный деструктор в unary_function при запуске lint. Лично я бы не пошел на компромисс с совершенно корректным кодом, хотя бы ни тем, ни другим.

1

По вопросам рекламы [email protected]