2016-03-30 7 views
1

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?

Antwort

0

Das Problem ist, dass loadList markiert const, zu sein und noch passieren Sie einen nicht konstanten Verweis auf die Membervariable resultList, die Sie ändern .

Es stimmt, dass die loadList Funktion nicht this Instanz nicht verändert direkt aber da man immer noch eine Membervariable die Funktion nicht konstant sein ändern kann.

Erstellen Sie entweder einen temporären Vektor, den Sie an die Funktion übergeben, oder stellen Sie die Funktion nicht auf .

+0

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

+0

@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. –

+0

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