c++ - 调用模板函数的误报错误 503

标签 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是一个模板函数,它需要尖括号中的类型,并尽力将其解释为 bool 表达式。

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

声明在 header 中的类内部,调用在该类的另一个成员函数中,它在 ShowWindowEx 之前声明。这两个成员函数的实现以相同的顺序在 .cpp 文件中发生,因此对 ShowWindowEx 的调用发生在其实现之前。 PC-Lint 是否可能只是忽略了 header ?

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

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

所以模板会处理指针类型。感谢 DeadMG 的建议。问题仍然存在,因为我认为没有理由上述方法不起作用,但它也以这种方式起作用。

最佳答案

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

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

如果是这种情况,我希望调用时会出现更多警告,但会解释模板 <...>因为两个比较运算符会合法地引发此警告。

除此之外,您提供的行 - 没有上下文 - 没有给出 503 在这里适用的任何理由。

关于c++ - 调用模板函数的误报错误 503,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7484982/

相关文章:

Python模板,有没有办法继承多个html文件?

.net - 从 VBA 调用 COM 加载项选项

c++ - 如何在 com 界面或非 mfc 应用程序中使用 ActiveX 控件?

c++ - 用 GCC 编译 WIN32 代码

c++ - 将c++程序与mysql连接时出现意外错误

c++ - 访问重载的模板函数

c# - 检索具有 CLSID 的组件的 COM 类工厂 - 类未注册

c++ - cout 是将 bool 视为整数还是将整数视为 bool?

C++11:按值调用、 move 语义和继承

c++ - 如何允许用户确定模板类型?