У меня есть некоторый код, который PC-Lint дает мне Ошибка 503: логический аргумент для реляционной связи на . Это вызов шаблонной функции, которая определяется следующим образом:
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>
и просто полагаться на вывод типа. (Не то, чтобы это отвечало на вопрос; |) - person Mankarse   schedule 20.09.2011error C2784: 'void CViewAreaOleCtl::ShowWindowEx(HWND,int,ITypeToUse *)' : could not deduce template argument for 'ITypeToUse *' from 'ATL::CComPtr<T>'
- person SvenS   schedule 20.09.2011IActualType
- это COM-интерфейс? (Это вообще представляет интерес?) Класс, содержащий два члена, также является производным от COM-классов. - person SvenS   schedule 20.09.2011ATL::CComPtr<T>
. - person Puppy   schedule 21.09.2011