при проверке функтора, который получен из 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 остается.
Следующее подавление работает для меня:
/*lint -esym(1790, "std::unary_function<*,*>") -esym(1509, unary_function) */
Здесь есть несколько подводных камней:
Что касается того, когда использовать пространство имен и когда его пропускать, просто используйте строку, заключенную в кавычки в сообщении об ошибке Lint, и все должно быть в порядке. Недостатком является то, что, похоже, нет способа отключить 1509 для std :: unary_function, но не для ns :: unary_function.
Вздох, Линт должен был узнать, что … Во всяком случае, то, что вы получаете, получая из unary_function, это несколько вложенных typedefs, смотрите http://www.cplusplus.com/reference/functional/unary_function/. Вы можете создать их самостоятельно, а не наследовать.
Другим способом было бы условно объявить виртуальный деструктор в unary_function при запуске lint. Лично я бы не пошел на компромисс с совершенно корректным кодом, хотя бы ни тем, ни другим.