Intellisense不使用模板VS2012 ultimate c ++

Yur*_*ida 7 c++ intellisense visual-studio-2012

Intellisense与我的VS工作非常糟糕......

当我使用C++进行编码时,它可以100%正常工作,直到我开始使用模板,然后它就完全停止工作,停止检测错误并且在所有情况下都不会自动完成.

我倾向于认为它与我用我的代码破坏它所做的事情有关.

所以我开始创建一个带有结构的类:

template<typename T>
class List<T>
{
private:
    struct Node
    {
        T value;
        Node* next;
        Node* previous;
    };
    Node* First;
    Node* Last;
...
};
Run Code Online (Sandbox Code Playgroud)

后来,我宣布了一些额外的功能:

template<typename T>
inline T List::First()
{
    return First;
}
Run Code Online (Sandbox Code Playgroud)

到目前为止这么好,intellisense工作100%罚款,但如果我尝试先做 - >它将无法正常工作,VS不会告诉我任何选项(ctrl + space不起作用).

另外,如果我输入一些废话,它不会告诉我这是错的:

sdkjgisjdga->vsrsiib = 123jgi;
Run Code Online (Sandbox Code Playgroud)

我真的不知道该怎么做才能解决这个问题.

感谢您的时间和精力.

PS:我已经尝试重置配置.

编辑:忘了说,如果我不在我的.h文件中使用模板,那么intellisense正常工作.

MSa*_*ers 8

模板需要先实例化,然后才能明确说出它们包含的内容.例如,您的First->代码段指向a List<T>::Node,这显然取决于确切的T.

当然,在这个简单的案例中,Intellisense可以通过替换T==int片刻来明确地列出成员.但是考虑一下更糟糕的是:Intellisense不知道成员(如现在)或Intellisense在最需要它的困难情况下猜错?


Rhe*_*vim 8

我对这个答案有点迟了,也许OP不再使用这个代码,但我认为这可能仍然有助于搜索模板和IntelliSense的人.

您可以尝试一件事 - 如果您希望能够在键入时看到拼写错误和错误,但是如果您希望您的代码能够模板化 - 则使用#if-#else-#endif:

#if MY_USE_TEMPLATES 
template <typename T> 
#else 
typedef [**your-test-type-here**] T; 
#endif 
class List { 
... your code here ... 
} 
Run Code Online (Sandbox Code Playgroud)

在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中试过这个.)