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 + space не работает).
Кроме того, если я введу какую-то ерунду, это не скажет мне, что это неправильно:
sdkjgisjdga->vsrsiib = 123jgi;
Я действительно не знаю, что делать, чтобы это исправить.
Спасибо за ваше время и усилия.
PS: я уже пытался сбросить настройки.
РЕДАКТИРОВАТЬ: Забыл сказать, что если я не использую шаблоны в моем файле .h, то Intellisense работает правильно.
Шаблоны должны быть созданы прежде, чем вы сможете окончательно сказать, что они содержат. Например, ваш First->
фрагмент указывает на List<T>::Node
и это, очевидно, зависит от точного T
,
Конечно, Intellisense в этом простом случае может однозначно перечислить членов, просто подставив T==int
на мгновение. Но подумайте о том, что хуже: Intellisense не знает участников (как сейчас) или Intellisense неправильно угадывает в трудных случаях, когда вам это нужно больше всего?
Я немного опоздал с этим ответом, и, возможно, 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 myList»), и вы можете решить это с помощью дополнительного фиктивного «шаблона» внутри оператора #else. Тем не менее, хорошая вещь, если оставить предложение #else без дополнительного «шаблона»: ошибка, возникающая при обращении к списку, может послужить вам напоминанием о необходимости включить MY_USE_TEMPLATES перед тестированием кода, уменьшая вероятность ошибки. (Опыт подсказывает, что это легко забыть при работе со многими вещами и крупными проектами …)
Однако будьте осторожны при использовании нескольких таких определений типов: typedef … T можно безопасно использовать только один раз для этого имени «T»; в то время как вы можете использовать ‘typedef … TYPE1’ для одного класса и ‘typedef … TYPE2’ для другого, вы не могу безопасно используйте одно и то же имя типа для разных типов, если вы не поместите разные имена типов в отдельные пространства имен. (Я попробовал это в Visual Studio 2015.)