7

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% 正常,但如果我尝试先做-> 它不起作用,VS 不会告诉我任何选项(ctrl + 空格不起作用)。

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

sdkjgisjdga->vsrsiib = 123jgi;

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

感谢您的时间和努力。

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

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

4

2 回答 2

8

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

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

于 2012-11-07T21:05:08.723 回答
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 ... 
} 

在 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,从而降低出现错误的可能性。(经验表明在处理很多事情和大型项目时很容易忘记......)

但是,在使用多个这样的类型定义时要小心:对于该名称“T”,“typedef ... T”只能安全地使用一次;虽然您可以对一个类使用 'typedef ... TYPE1' 而对另一个类使用 'typedef ... TYPE2',但您不能安全地对不同类型使用相同的类型名称,除非您将不同的类型名称放入单独的命名空间中。(我在 Visual Studio 2015 中尝试过。)

于 2015-11-18T19:35:50.190 回答