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;
}

これまでのところ、インテリセンスは 100% 正常に動作していますが、最初に実行しようとすると、動作しません。VS はオプションを教えてくれません (ctrl + スペースは動作しません)。

また、ナンセンスを入力しても、それが間違っているとはわかりません。

sdkjgisjdga->vsrsiib = 123jgi;

これを修正するために何をすべきか本当にわかりません。

あなたの時間と努力に感謝します。

PS: 設定をリセットしようとしました。

編集: .h ファイルでテンプレートを使用しない場合、インテリセンスが正しく機能することを忘れていました。

4

2 に答える 2

8

テンプレートの内容を明確に言う前に、テンプレートをインスタンス化する必要があります。たとえば、First->スニペットがを指しているList<T>::Node場合、それは明らかに正確なに依存しTます。

確かに、この単純なケースのIntellisenseは、少しの間置き換えるだけで、メンバーを明確にリストできT==intます。しかし、さらに悪いことを考えてみてください。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 ステートメント内に追加のダミーの 'template' を使用して解決できます。ただし、追加の「テンプレート」なしで #else 句を残すことの良い点は、リストを参照するときに発生するエラーが、コードをテストする前に MY_USE_TEMPLATES をオンにするリマインダーとして役立ち、バグの可能性を減らすことです。(経験上、多くのことや大規模なプロジェクトを処理すると忘れやすいことが示唆されています...)

ただし、そのような型定義を複数使用する場合は注意してください。'typedef ... T' は、その名前 "T" に対して 1 回だけ安全に使用できます。あるクラスに「typedef ... TYPE1」を使用し、別のクラスに「typedef ... TYPE2」を使用できますが、異なる型名を別々の名前空間に配置しない限り、異なる型に同じ型名を安全に使用することはできません。(Visual Studio 2015 で試しました。)

于 2015-11-18T19:35:50.190 に答える