误报错误503用于调用模板功能

时间:2011-09-20 12:15:38

标签: c++ templates com atl lint

我有一些PC-Lint给我Error 503: Boolean argument to relational的代码。它是对模板函数的调用,其定义如下:

template <typename ITypeToUse>
void ShowWindowEx(
    HWND hWnd,
    int nCmdShow,
    ITypeToUse *pControl);

电话本身如下:

ShowWindowEx<IActualType>(this->GetWndHandle(), SW_SHOW, m_spControl);

显然,部分ShowWindowEx<IActualType>(...)被解释为Identifier1 < Identifier2 > Expression ... PC-Lint似乎没有意识到ShowWindowEx是一个模板函数,需要在有角度的括号和尝试中输入类型最好将其解释为布尔表达式。

我知道我可以简单地告诉lint忽略这一行的错误(虽然实际上它大约有30行),但我想防止这种情况再次发生。另外,据我所知,PC-Lint应该能够处理模板函数调用,不知道为什么不是这种情况呢?

声明位于标题中的一个类中,并且该调用位于该类的另一个成员函数中,该函数在ShowWindowEx之前声明。两个成员函数的实现在.cpp文件中以相同的顺序发生,因此对ShowWindowEx的调用在其实现之前发生。 PC-Lint是否可以忽略标题?

编辑: 我现在将函数原型更改为:

template <typename IPointerToUse>
void ShowWindowEx(
    HWND hWnd,
    int nCmdShow,
    IPointerToUse pControl);

因此模板将处理作为指针的类型。感谢DeadMG的建议。问题仍然存在,因为我认为上述情况不应该有效,但它也是这样的。

2 个答案:

答案 0 :(得分:1)

503通常是C警告,而不是C ++。是否可以通过Lint将包含模板函数调用的C ++文件视为C文件,也可以在Windows机器上使用* .C(大写字母)?或使用非标准扩展名?

我已经看到在Windows PC Lint安装中使用Samba来获取Unix C ++程序时会发生这种情况。 如果这仍然是一个问题,请查看指示模块名称的输出行,如--- Module: ...,并查看括号之间的文件类型。如果关闭,您可能需要使用-vm(默认)。

如果是这种情况,我预计会有更多警告,但是将模板<...>解释为两个比较运算符会合法地引发此警告。

除此之外,你提供的那一行 - 没有上下文 - 没有说明为什么503可以在这里适用。

答案 1 :(得分:0)

也许原因是Windows标头中已经有ShowWindowEx(一个没有模板定义)的定义。 也许你应该尝试重命名你的功能。