2015-02-06 8 views
7

Wie kann ich automatische Vervollständigung in Qt Creator Arbeit für std::vector machen? Ist es normal, dass es nicht funktioniert?Qt Creator's Autocomplete (IntelliSense) funktioniert nicht für std :: vector elements

Zum Beispiel, auf ein frisches neues Projekt, erstelle ich eine struct foo { int bar; };. Wenn ich eine QVector von foo, Intellisense/automatische Vervollständigung erstellen funktioniert:

enter image description here

Aber für eine std::vector<foo> v2nichts passiert, nachdem ich den Punkt drücken in v2[0].

Ich bin auf Qt Creator 3.3. 0, mit der Visual Studio Compiler Tool-Kette (so kommt die STL von VS, nicht gcc, wenn das einen Unterschied macht).

Bearbeiten: Ich habe einen verwandten Fehler gemeldet (über Iteratoren obwohl) - https://bugreports.qt.io/browse/QTCREATORBUG-1892. Ich reproduciere dieses Problem auch.

Edit 2: ich mit einem benutzerdefinierten Template-Klasse getestet:

struct bar { 
    int b; 
}; 
template<class T> struct foo { 
    T operator [](int a) { return T(); } 
}; 

Und es funktioniert gut:

enter image description here

+0

Nicht möglich. Leider hat Qt Creators Codemodell Probleme mit Vorlagen. Es wurde gerade daran gearbeitet, Clongs zu benutzen, aber ich weiß nicht, wie das endete. –

+0

@cassiorenan Btw, reproduziert das auch für dich? – sashoalm

+0

ja, tut es. Ich verwende Qt Creator 3.3.2 BTW, Ihr Test ist fehlerhaft. Versuchen Sie, einen Operator [] zu implementieren, der einfach a zurückgibt. –

Antwort

5

Wie pro meine Kommentare, es ist einfach nicht möglich, dies zu tun . Sie können einen Fehlerbericht einreichen und hoffen, dass er behoben wird. besser zu erklären, hat es etwas mit std :: vector-Implementierung zu tun:

reference operator[](difference_type _Off) const 
    { // subscript 
    return (*(*this + _Off)); 
    } 

In der reference als Allocator::reference typedef ist. Anscheinend hat Qt Creator Probleme damit, der ursprünglichen Klasse zu folgen. Vergleichen Sie das mit QVector der ...

inline T &QVector<T>::operator[](int i) 
{ Q_ASSERT_X(i >= 0 && i < d->size, "QVector<T>::operator[]", "index out of range"); 
    return data()[i]; } 

... die & direkt in Bezug auf T definiert ist, und man kann sehen, warum es für sie funktioniert.

Update: Suchen Sie in cppreference's page on vector, scheint es, dass nach C++ 11, Referenz sollte typedef'ed einfach als value_type & sein. Ich habe versucht mit CONFIG += c++11 bauen und es funktioniert immer noch nicht.

Und ein weiteres Update: Verwaltete einen minimalen Testfall zu kodieren, die nicht

template<typename T> 
class foo{ 
public: 
    typedef T value_type; 
    typedef value_type& reference; 
    T a; 
    reference operator[](int){return a;} 
}; 

struct bar{int b;}; 
0

I @ Cassios Beispielcode zu vereinfachen funktionieren gelungen, das Problem zu reproduzieren:

struct T { int b; }; 
struct foo{ 
    typedef T value_type; 
    T a; 
    value_type operator[](int); 
    value_type bar(); 
}; 

Was interessant ist, dass a.bar(). funktioniert, aber a[1]. nicht. Außerdem ist es am aussagekräftigsten, wenn Sie den Operator [] als foo::value_type operator[](int); deklarieren, wird die automatische Vervollständigung funktionieren.

2

nun das Klirren Code Modell ist erhältlich:

Zum Hilfe-> Über Plug-Ins ...-> aktivieren ClangCodeModel

Neustart Qt Creator. Überprüfen Sie, ob es aktiviert wurde; Werkzeuge -> C++ -> Codemodell

Voila-Code automatische Vervollständigung für Std: Vektor.