【发布时间】: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<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 的建议。问题仍然存在,因为我认为上述方法不应该起作用,但它也可以这样工作。
【问题讨论】:
-
在这种特殊情况下,应该可以完全放弃
<IActualType>,而只依赖类型推断。 (并不是说这回答了问题;|) -
@Mank:我在一些教程中看到它是这样完成的。不知道这在语法上是否正确所以我没有提到它,但我已经尝试过并遇到错误:
error C2784: 'void CViewAreaOleCtl::ShowWindowEx(HWND,int,ITypeToUse *)' : could not deduce template argument for 'ITypeToUse *' from 'ATL::CComPtr<T>' -
我有没有提到
IActualType是一个COM 接口? (它甚至感兴趣吗?)包含这两个成员的类也是从 COM 类派生的。 -
@SvenS:问题是您使用的是原始指针,而实际上,您应该使用普通类型 T。然后 T 可以推导出为
ATL::CComPtr<T>。 -
@DeadMG:你是对的,这应该是一个有效的解决方法。我会尝试并将其附加到我的问题中(虽然它并没有真正解决问题)。
标签: c++ templates com atl lint