Intellisense不使用模板VS2012 ultimate c ++

时间:2012-11-07 17:30:08

标签: c++ visual-studio-2012 intellisense

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

当我使用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;
}
到目前为止,如此好,intellisense工作100%罚款,但如果我尝试先做 - &gt;它不会起作用,VS不会告诉我任何选项(ctrl + space不起作用)。

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

sdkjgisjdga->vsrsiib = 123jgi;

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

感谢您的时间和精力。

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

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

2 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:6)

我对这个答案有点迟了,也许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 ... 
} 

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

相关问题