Ложная ошибка 503 для вызова функции шаблона - PullRequest
5 голосов
/ 20 сентября 2011

У меня есть код, который мне дает 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 просто игнорировать заголовок?

EDIT: Теперь я изменил прототип функции на:

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

Таким образом, шаблон будет заботиться о типе, являющемся указателем. Спасибо DeadMG за предложение. Вопрос все еще стоит, поскольку я не вижу причин, по которым вышесказанное не должно сработать, но оно работает и так.

Ответы [ 2 ]

1 голос
/ 29 ноября 2012

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

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

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

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

0 голосов
/ 04 октября 2011

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

...