2012-11-07 102 views
6

智能感知與我的工作VS非常糟糕的工作...智能感知無法使用模板VS2012最終C++

當我用C編碼我++它工作100%的罰款,直到我開始使用模板,那麼它只是停止工作完全停止檢測錯誤並且不會在所有情況下自動完成。

我傾向於相信它與我用我的代碼破壞它的事情有關。

於是我開始在這一個結構創建一個類:

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

後,我宣佈了一些附加功能:

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

到目前爲止好,智能感知工作100%的罰款,但如果我嘗試先做 - >它不會工作,VS不會告訴給我任何選項(CTRL +空格不起作用)。

另外,如果我輸入一些廢話也不會告訴我,這是錯的:

sdkjgisjdga->vsrsiib = 123jgi; 

我真的不知道怎麼做才能解決這個事情。

謝謝你的時間和精力。

PS:我已經嘗試重置配置。

編輯:忘了說,如果我不在我的.h文件中使用模板,然後intellisense正常工作。

回答

8

模板需要實例化之後才能明確說出它們包含的內容。例如,您的First->代碼片段指向List<T>::Node,這顯然取決於確切的T

當然,在這種簡單的情況下,Intellisense只需用T==int代替即可明確列出成員。但請考慮更糟的情況:Intellisense在最需要的困難情況下不知道成員(如現在)或智能感知錯誤猜測?

+1

好的,所以它的工作原理和我不是做了錯誤的= = ty。我只需要習慣它。 –

6

我有點遲了這個答案,也許OP不再處理此代碼,但我認爲這可能仍然有助於搜索模板和智能感知的人。

您可以嘗試的一件事 - 如果您希望能夠在鍵入時看到您的拼寫錯誤和錯誤,但是如果您希望自己的代碼能夠進行模板化,則可以使用#if-#else-# endif:

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

在Visual Studio 2015中,這似乎工作。您可以將MY_USE_TEMPLATES定義爲0(使用#define),使用IntelliSense和自動完成等開發代碼(這樣可以減少錯誤),然後在準備測試或編譯時將MY_USE_TEMPLATES更改爲1實際的模板代碼。

雖然啓用了MY_USE_TEMPLATES,但引用List的代碼將導致錯誤(即,像'List myList'之類的代碼),並且可以在#else語句內使用額外的虛擬「模板」來解決該問題。然而,在沒有額外'模板'的情況下離開#else子句的好處是:在引用List時得到的錯誤可能會提醒您在測試代碼之前打開MY_USE_TEMPLATES,從而減少錯誤的可能性。(經驗表明在處理很多事情和大型項目時很容易忘記......)

但是要小心使用多個這樣的類型定義,但是:'typedef ... T'只能是安全的曾用過那個名字「T」;雖然對於一個類可以使用'typedef ... TYPE1',對於另一個類可以使用'typedef ... TYPE2',但是除非將不同的類型名稱放入單獨的名稱空間,否則不能爲安全地使用相同類型的名稱。 (我在Visual Studio 2015中試過。)