Странные ошибки PC-Lint с шаблонами элементов

В настоящее время я борюсь с PC-Lint (версии 9.00j и l), который дает мне некоторые ошибки и предупреждения для фрагмента кода. Код хорошо компилируется и работает как положено. Вот упрощенная версия этого:

#include <iostream>
#include <vector>

typedef unsigned char uint8_t;

class Test
{
uint8_t          inputList[10];
std::vector<int> resultList;

public:

Test() : resultList()
{
for (uint8_t ii = 0; ii < 10; ++ii)
inputList[ii] = ii;
}

template<int list_size, typename ResultListType>
void loadList(const uint8_t (& inputList)[list_size],
ResultListType & resultList) const
{
for (uint8_t ii = 0; ii < list_size; ++ii)
resultList.push_back(inputList[ii]);
}

void run()
{
loadList(inputList, resultList);
}

void print()
{
std::vector<int>::iterator it;
for (it = resultList.begin(); it != resultList.end(); ++it)
std::cout << *it << std::endl;
}
};

int main()
{
Test t;
t.run();
t.print();
}

При запуске этого в онлайн-демонстрации Gimpel, я получаю эти ошибки и предупреждения:

    30      loadList(inputList, resultList);
diy.cpp  30  Error 1025:  No template matches invocation 'Test::loadList(unsigned char [10], std::vector<int>)', 1 candidates found, 1 matched the argument count
diy.cpp  30  Info 1703:  Function 'Test::loadList(const unsigned char (&)[V], <2>&) const' arbitrarily selected. Refer to Error 1025
diy.cpp  30  Error 1032:  Member 'loadList' cannot be called without object
diy.cpp  30  Error 1058:  While calling 'Test::loadList(const unsigned char (&)[V], <2>&) const': Initializing a non-const reference '<2>&' with a non-lvalue (a temporary object of type 'std::vector<int>')
diy.cpp  30  Warning 1514:  Creating temporary to copy 'std::vector<int>' to '<2>&' (context: arg. no. 2)

В общем, PC-Lint пытается сказать мне, что он просто найдет нужные параметры шаблона случайно и будет заполнена только временная копия вектора. Но код работает хорошо, resultList содержит данные!

Кто-нибудь может сказать мне, что здесь происходит? Правильно ли работает PC-Lint и что-то идет не так или это просто ошибка PC-Lint?

1

Решение

Проблема в том, что loadList помечен как constи все же вы передаете непостоянную ссылку на переменную-член resultList что ты модифицировать.

Это правда, что loadList функция не меняет this пример непосредственно но поскольку вы все еще изменяете переменную-член, функция не может быть постоянной.

Либо создайте временный вектор, который вы передаете функции, либо сделайте функцию не const,

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]