【问题标题】:False positive Error 503 for call to template function调用模板函数的误报错误 503
【发布时间】:2011-11-21 01:10:16
【问题描述】:

我有一些代码是 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&lt;IActualType&gt;(...) 部分被解释为Identifier1 &lt; Identifier2 &gt; 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 的建议。问题仍然存在,因为我认为上述方法不应该起作用,但它也可以这样工作。

【问题讨论】:

  • 在这种特殊情况下,应该可以完全放弃&lt;IActualType&gt;,而只依赖类型推断。 (并不是说这回答了问题;|)
  • @Mank:我在一些教程中看到它是这样完成的。不知道这在语法上是否正确所以我没有提到它,但我已经尝试过并遇到错误:error C2784: 'void CViewAreaOleCtl::ShowWindowEx(HWND,int,ITypeToUse *)' : could not deduce template argument for 'ITypeToUse *' from 'ATL::CComPtr&lt;T&gt;'
  • 我有没有提到IActualType 是一个COM 接口? (它甚至感兴趣吗?)包含这两个成员的类也是从 COM 类派生的。
  • @SvenS:问题是您使用的是原始指针,而实际上,您应该使用普通类型 T。然后 T 可以推导出为 ATL::CComPtr&lt;T&gt;
  • @DeadMG:你是对的,这应该是一个有效的解决方法。我会尝试并将其附加到我的问题中(虽然它并没有真正解决问题)。

标签: c++ templates com atl lint


【解决方案1】:

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

【讨论】:

  • 如果有的话,MSDN(或网络上的其他任何地方)都会提到它,不是吗?谷歌没有返回任何结果。改名不是我的选择。
  • 也许命名空间会比重命名更好?
  • 这就是命名空间的用途
【解决方案2】:

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

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

如果是这种情况,我预计会在调用周围出现更多警告,但将模板 &lt;...&gt; 解释为两个比较运算符会合理地引发此警告。

除此之外,您提出的那一行 - 没有上下文 - 没有给出任何理由说明 503 可能适用于此。

【讨论】:

  • 听起来很有道理,我记得偶尔会看到一些文件全部大写,包括扩展名。我现在正在处理其他问题,但我会将其转发给接手该主题的同事。
猜你喜欢
  • 1970-01-01
  • 2017-07-14
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
  • 2020-10-02
  • 2017-09-26
  • 1970-01-01
  • 2013-08-30
相关资源
最近更新 更多