使用std :: unary_function时的Lint警告

时间:2013-04-12 13:12:19

标签: c++ functor lint

检查从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

根据 Scott Meyers ,仿函数类应该通过派生unary/binary_function来实现,这些unary_function基本上只是的typedef 的集合,因此,它们不是需要任何构造函数/析构函数的类。因此,棉绒警告本身是正确的。

是否有人知道如何全局取消 全部这些警告,并且仅限-e1509等所有用途?我希望每次使用时都避免写{{1}}。

可以使用私有继承而不是公共来抑制信息#1790,但警告#1509仍然存在。

2 个答案:

答案 0 :(得分:1)

叹了口气,lint应该已经知道了...无论如何,你从unary_function派生的东西是一些嵌套的typedef,参见http://www.cplusplus.com/reference/functional/unary_function/。您可以自己创建这些而不是继承它们。

另一种方法是在lint运行时有条件地在unary_function中声明一个虚析构函数。我个人不会为了lint而妥协完全有效的代码,无论是在某种方式还是在另一种方式。

答案 1 :(得分:1)

以下抑制对我有用:

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

这里有一些陷阱:

  • 请注意esym参数的引号,因此Lint不会解释模板参数列表中的逗号
  • 消息1790在“符号”上进行参数化 - 因此在引用时必须使用完整的命名空间
  • 另一方面,消息1509在“名称”上进行参数化,因此您不应该给它提供完整的命名空间

至于何时使用命名空间以及何时省略它,只需使用Lint错误消息中引用的字符串,它应该没问题。缺点是似乎没有办法为std :: unary_function禁用1509,但对于ns :: unary_function则没有。