2012-11-07 15 views
6

Intellisense sta lavorando molto male con la mia VS ...Intellisense non funziona con i modelli VS2012 C++ ultimo

Quando sto codifica in C++ funziona al 100% bene, fino a quando ho iniziare a utilizzare i modelli, poi appena smette di funzionare completamente, interrompe il rilevamento degli errori e non si completa automaticamente in tutti i casi.

Sono incline a credere che abbia a che fare con qualcosa che ho fatto con il mio codice che lo ha rotto.

Così ho iniziato con la creazione di una classe con una struttura in esso:

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

tardi, dichiaro alcune funzioni aggiuntive:

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

finora tutto bene, intellisense sta lavorando al 100% multa , ma se provo a fare prima-> non funzionerà, VS non dirà di darmi alcuna opzione (ctrl + spazio non funziona).

anche, se digito qualche sciocchezza che non mi dire che è sbagliato:

sdkjgisjdga->vsrsiib = 123jgi; 

io non so davvero cosa fare per risolvere questo problema.

Grazie per il vostro tempo e impegno.

PS: ho già provato a ripristinare le configurazioni.

EDIT: Ho dimenticato di dire che se non utilizzo i modelli nel mio file .h, intellisense funziona correttamente.

risposta

8

I modelli devono essere istanziati prima di poter dire in modo definitivo cosa contengono. Ad esempio, lo snippet First-> punta a List<T>::Node e ovviamente dipende dall'esatto numero T.

Certo, Intellisense in questo semplice caso potrebbe elencare in modo inequivocabile i membri semplicemente sostituendo T==int per un momento. Ma considera ciò che è peggio: Intellisense non conosce i membri (come ora) o Intellisense che sbagliano nei casi difficili in cui ne hai più bisogno?

+1

Ok, quindi funziona come inteso e non ero io a fare qualcosa di sbagliato =) ty per la risposta. Dovrò solo abituarmi. –

6

Sono un po 'in ritardo con questa risposta, e forse l'OP non funziona più su questo codice, ma penso che questo possa ancora aiutare qualcuno che sta cercando modelli e IntelliSense.

Una cosa che puoi provare - se vuoi essere in grado di vedere i tuoi errori di battitura durante la digitazione, ma se vuoi che il tuo codice sia in grado di stampare template - usa # if- # else- # endif:

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

In Visual Studio 2015 sembra funzionare. Puoi definire MY_USE_TEMPLATES come 0 (utilizzando un #define), sviluppare il tuo codice con IntelliSense e completare automaticamente, ecc. (Così fai meno errori), e poi cambia MY_USE_TEMPLATES in 1 quando sei pronto per testare o compilare codice del modello attuale.

Mentre hai attivato MY_USE_TEMPLATES, il codice che fa riferimento alla tua lista genera un errore (ad esempio un codice come "List myList") e puoi risolverlo con un "modello" fittizio extra all'interno dell'istruzione #else. Tuttavia, la cosa buona dell'abbandonare la clausola #else senza un "modello" extra è: l'errore che si ottiene quando si fa riferimento all'Elenco può servire come promemoria per attivare MY_USE_TEMPLATES prima di testare il codice, riducendo la probabilità di un bug.(L'esperienza suggerisce che è facile dimenticarsi quando si gestiscono molte cose e grandi progetti ...)

Fare attenzione all'utilizzo di più definizioni di questo tipo, tuttavia: il 'typedef ... T' può essere solo sicuro usato una volta per quel nome "T"; mentre puoi usare 'typedef ... TYPE1' per una classe e 'typedef ... TYPE2' per un'altra, non puoi utilizzare lo stesso nome di tipo per tipi diversi a meno che non si inseriscano i nomi dei tipi diversi in spazi dei nomi separati. (Ho provato questo in Visual Studio 2015.)

Problemi correlati