2012-11-07 8 views
6

Intellisense pracuje bardzo źle z moim VS ...Intellisense nie działa z szablonami VS2012 ostatecznego C++

Kiedy jestem kodowania w C++ działa 100% grzywny, aż zacznę za pomocą szablonów, a następnie po prostu przestaje działać całkowicie, przestaje wykrywać błędy i nie jest automatycznie uzupełniane we wszystkich przypadkach.

Jestem skłonny wierzyć, że ma to związek z tym, co zrobiłem z moim kodem, który je zepsuł.

Zacząłem więc tworząc klasę z struct w nim:

template<typename T> 
class List<T> 
{ 
private: 
    struct Node 
    { 
     T value; 
     Node* next; 
     Node* previous; 
    }; 
    Node* First; 
    Node* Last; 
... 
}; 

później, oświadczam pewne dodatkowe funkcje:

template<typename T> 
inline T List::First() 
{ 
    return First; 
} 

tej pory tak dobrze, intellisense pracuje 100% grzywny , ale jeśli spróbuję najpierw-> to nie zadziała, VS nie powie mi dać żadnych opcji (ctrl + spacja nie działa).

również, jeśli wpisuję jakieś bzdury, że nie będzie mi powiedzieć, że to jest złe:

sdkjgisjdga->vsrsiib = 123jgi; 

ja naprawdę nie wiem, co zrobić, aby to naprawić.

Dziękuję za poświęcony czas i wysiłek.

PS: Próbowałem już zresetować konfiguracje.

EDYCJA: Zapomniałem powiedzieć, że jeśli nie używam szablonów w moim pliku .h, to intellisense działa poprawnie.

Odpowiedz

8

Szablony należy utworzyć instancję, aby móc definitywnie powiedzieć, co zawierają. Na przykład Twój fragment First-> wskazuje na List<T>::Node, a to oczywiście zależy od dokładnej wartości T.

Pewnie, Intellisense w tym prostym przypadku może jednoznacznie wymienić członków, po prostu zastępując na chwilę T==int. Ale zastanów się, co jest gorsze: Intellisense nie zna członków (jak teraz) lub Intellisense błędnie odgaduje w trudnych przypadkach, w których jest to najbardziej potrzebne?

+1

Ok, więc działa jak zamieniony i nie był mną, który zrobił coś złego =) dla odpowiedzi. Po prostu muszę się do tego przyzwyczaić. –

6

Trochę się spóźniłem z tą odpowiedzią, i być może OP nie pracuje już nad tym kodem, ale myślę, że to nadal może pomóc komuś, kto szuka szablonów i IntelliSense.

Jedną z rzeczy, którą możesz wypróbować - jeśli chcesz móc wyświetlać literówki i błędy podczas pisania, ale jeśli chcesz, aby Twój kod był szablonowy - używasz # if- # else- # endif:

#if MY_USE_TEMPLATES 
template <typename T> 
#else 
typedef [**your-test-type-here**] T; 
#endif 
class List { 
... your code here ... 
} 

Wydaje się działać w Visual Studio 2015. Możesz zdefiniować MY_USE_TEMPLATES na 0 (używająC#define), rozwinąć swój kod za pomocą IntelliSense i autouzupełniania itp. (Aby zmniejszyć liczbę błędów), a następnie zmienić MY_USE_TEMPLATES na 1, gdy będziesz gotowy do przetestowania lub skompilowania z aktualny kod szablonu.

Gdy masz włączone MY_USE_TEMPLATES, kod, który odwołuje się do Twojej listy spowoduje błąd (tj. Kod taki jak "List myList"), i możesz rozwiązać ten problem za pomocą dodatkowego "szablonu" wewnątrz instrukcji #else. Jednak dobrą rzeczą w opuszczaniu klauzuli #else bez dodatkowego "szablonu" jest: błąd, który pojawia się podczas przywoływania listy może służyć jako przypomnienie, aby włączyć MY_USE_TEMPLATES przed testowaniem kodu, zmniejszając prawdopodobieństwo wystąpienia błędu.(Doświadczenie sugeruje, że łatwo jest zapomnieć przy obsłudze wielu rzeczy i dużych projektów ...)

Należy jednak zachować ostrożność przy stosowaniu wielu takich definicji typów: "typedef ... T" może być bezpiecznie użyte raz dla tej nazwy "T"; podczas gdy możesz użyć "typedef ... TYPE1" dla jednej klasy i "typedef ... TYPE2" dla innego, ty nie można bezpiecznie używać tego samego typu dla różnych typów, chyba że umieścisz nazwy różnych typów w oddzielnych przestrzeniach nazw. (Próbowałem tego w Visual Studio 2015).

Powiązane problemy