Ich kämpfe derzeit mit PC-Lint (Version 9.00j und l), die mir einige Fehler und Warnungen für ein Stück Code gibt. Der Code kompiliert gut und wird wie erwartet ausgeführt. Hier ist eine vereinfachte Version davon:Seltsame PC-Lint-Fehler mit Member-Vorlagen
#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();
}
Wenn diese Online-Demo in Gimpel läuft, bekomme ich diese Fehler und Warnungen:
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)
Also im Grunde, PC-Lint versuchen, mir zu sagen, dass es findet zufällig nur die richtigen Template-Parameter und nur eine temporäre Kopie des Vektors wird gefüllt. Aber der Code läuft gut, die resultList enthält die Daten!
Kann mir jemand sagen, was hier vor sich geht? Ist PC-Lint richtig und etwas läuft schief oder ist das nur ein PC-Lint Bug?
Ich bekomme die gleichen Fehler/Warnungen, wenn Sie diese const. Ich habe es hinzugefügt, weil es in der Beschreibung von Fehler [1058] erwähnt wurde (http://gimpel-online.com/MsgRef.html#1058) – craesh
@craesh Es funktioniert gut, wenn Sie die Vorlageargumente explizit angeben, wie in ' oadList <10, std :: vector> (inputList, resultList) '. Ich würde vorsichtig sagen, dass es ein Problem mit Template-Matching und Overload-Auflösung in PC-Lint ist. –
Es funktioniert sogar, wenn ich nur das erste Argument, die Größe angeben. Ich erinnere mich, dass ich vor einiger Zeit ein ähnliches Problem hatte, es wurde von '// lint-fvl' gelöst. Arrays mit variabler Länge sind eine GNU-Erweiterung, die in der Standard-Lint-Konfig ... – craesh