Ложное срабатывание Ошибка 503 для вызова функции шаблона

У меня есть некоторый код, который 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 за предложение. Вопрос все еще остается в силе, так как я не вижу причин, по которым вышеизложенное не должно было работать, но это работает и так.


person SvenS    schedule 20.09.2011    source источник
comment
В этом конкретном случае должна быть возможность вообще отказаться от <IActualType> и просто полагаться на вывод типа. (Не то, чтобы это отвечало на вопрос; |)   -  person Mankarse    schedule 20.09.2011
comment
@Mank: я видел, как это делается в каком-то учебнике. Не знал, правильно ли это синтаксически, поэтому не упомянул об этом, но я уже пробовал и столкнулся с ошибкой: error C2784: 'void CViewAreaOleCtl::ShowWindowEx(HWND,int,ITypeToUse *)' : could not deduce template argument for 'ITypeToUse *' from 'ATL::CComPtr<T>'   -  person SvenS    schedule 20.09.2011
comment
Я упоминал, что IActualType - это COM-интерфейс? (Это вообще представляет интерес?) Класс, содержащий два члена, также является производным от COM-классов.   -  person SvenS    schedule 20.09.2011
comment
@SvenS: Проблема в том, что вы берете необработанный указатель, тогда как на самом деле вы должны брать простой тип T. Тогда T можно вывести как ATL::CComPtr<T>.   -  person Puppy    schedule 21.09.2011
comment
@DeadMG: Вы правы, это должно быть допустимым обходным путем. Я попробую и добавлю его как таковой к моему вопросу (хотя на самом деле это не решает проблему).   -  person SvenS    schedule 21.09.2011
comment
Вы пытались сообщить об этом напрямую в Gimpel? По моему опыту, они очень быстро реагируют на отчеты о проблемах, особенно если вы предоставляете минимальный пример, демонстрирующий проблему.   -  person Alan Stokes    schedule 29.11.2011
comment
Да, у меня есть. Но я вернулся к тому, что @DeadMG предложил ранее.   -  person SvenS    schedule 29.11.2011


Ответы (2)


503 обычно является предупреждением C, а не C++. Может ли быть так, что ваш файл C++, содержащий вызов функции шаблона, рассматривается Lint как файл C, возможно, с использованием *.C (заглавная буква) на компьютере с Windows? или используя нестандартное расширение?

Я видел, как это происходило при использовании Samba для Lint программы Unix C++ при установке Lint на ПК с Windows. Если это все еще проблема, посмотрите на строки вывода, указывающие имена модулей, такие как --- Module: ..., и посмотрите на тип файла в круглых скобках. Если функция отключена, вам может понадобиться использовать -vm (по умолчанию).

Если это так, я бы ожидал гораздо больше предупреждений вокруг вызова, но интерпретация шаблона <...> как двух операторов сравнения законно вызовет это предупреждение.

Кроме этого, представленная вами строка - без контекста - не дает никаких причин, по которым 503 может быть применимо здесь.

person Johan Bezem    schedule 29.11.2012
comment
Звучит очень правдоподобно, я помню, что иногда видел некоторые файлы, написанные заглавными буквами, включая расширение. Сейчас я работаю над другими вопросами, но я передам это своему коллеге, который взял на себя эту тему. - person SvenS; 29.11.2012

Возможно, причина в том, что в заголовках Windows уже есть определение ShowWindowEx (не являющееся определением шаблона). Возможно, вам стоит попробовать переименовать вашу функцию.

person David Feurle    schedule 04.10.2011
comment
Если бы он был, он был бы упомянут в MSDN (или где-либо еще в сети), не так ли? Google ничего не дал. Менять имя не вариант для меня. - person SvenS; 04.10.2011
comment
Возможно, пространство имен было бы лучшим решением, чем переименование? - person ; 21.10.2011
comment
Вот для чего нужны пространства имен - person BlueRaja - Danny Pflughoeft; 29.11.2011