Почему VS не выполняет автозаполнение при использовании шаблонов? - PullRequest
1 голос
/ 24 мая 2019

Я работаю над некоторыми структурами данных в C ++, используя шаблоны, и столкнулся с некоторыми проблемами. Я реализую HashTable, используя цепочку, и я также реализовал Linked List. Первой проблемой, которую я запустил, была ошибка связывания с моими определениями шаблонов, которая Я решил, включив файл .cpp, где было объявление.

Теперь я столкнулся с другой проблемой, и я не уверен, что это проблема, связанная с шаблонами или настройками VS. Прежде всего, создание проекта не обновит его, если я по какой-то причине не сохраню и не скомпилирую точку входа. Я читаю некоторые проблемы, и настройки кажутся нормальными. Самая важная проблема, с которой я столкнулся, заключалась в том, что в моем файле Hashtable.cpp есть проблемы с автозаполнением, касающиеся ONLY всего, что связано с моим классом List.

Например: Я использовал List<T> **arr в своем классе Hashtable и всякий раз, когда я пытаюсь использовать любой из методов списка, например, arr[1]->insert(100) не только не выполняет автозаполнение, но и говорит, что метод принадлежит, как я покажу на скриншоте ниже. Объявления выглядят так: Hashtable.h

#pragma once
#include "Log.h"
#include "List.h"
#include <vector>
#include <iostream>

Hashtable.cpp: #include "Hashtable.h"

А в моем списке нет ничего особенного, кроме iostream и т. Д.

Я хочу отметить, что код не выполняет автозаполнение, но он работает, он запускает правильные методы, но работать с ним действительно неудобно и раздражает. Также я беспокоюсь, что он может не работать на другом компьютере, что действительно важно мне. Ты хоть представляешь, что может быть не так?

Скриншот, который я упомянул

Ответы [ 3 ]

2 голосов
/ 24 мая 2019

В более новой версии Visual Studio имеется функция, позволяющая выбирать конкретные типы для создания экземпляра данного шаблона с целью автозаполнения в нем:

enter image description here

В VS2017 вы должны ввести их вручную. В VS2019 вы можете выбрать из списка реальных экземпляров шаблона, в котором вы находитесь.

Без этих подсказок у Intellisense нет шансов узнать, что имеет Hashtable<T> с точки зрения членов - вы можете специализировать его любое количество раз, arr может иметь любой тип, а clear() может возвращать все виды вещи в зависимости от T. Любые предложения, которые он дает, могут быть неправильными для другого набора аргументов шаблона ...

2 голосов
/ 24 мая 2019

Автозаполнение путается с шаблонами. Имейте в виду, что когда компилятор компилирует шаблонный код, он знает, какими будут параметры шаблона. Напротив, когда вы пишете код в шаблонном классе, система автозаполнения не знает, каким будет этот параметр.

Например, если у вас есть List<T> **arr, а у List есть метод insert(), допустимо ли arr[1]->insert(100)? Может быть! а может и нет. Может быть специализация List для конкретного T, у которого нет метода insert.

Кроме того, системы автозаполнения, как правило, представляют собой такое же искусство, как и наука, поскольку они должны работать с интерактивной скоростью и должны быть устойчивы к синтаксическим ошибкам, ранее возникающим в коде. Шаблоны ставят их в худшее положение, поскольку синтаксис и грамматика шаблонов гораздо сложнее получить правильное представление, чем в других областях C ++, поэтому при работе с сильно шаблонным кодом вы будете склонны видеть, что автозаполнение работает хуже всего.

При работе с сильно шаблонным кодом я иногда «де-шаблонировал» код, работая над ним, просто чтобы помочь компилятору. Последние версии VS на самом деле помогут вам в этом: шаблоны, которые компилятор смущает, могут (обычно, но не всегда, и я не уверен, почему) предложить вам возможность помочь:

enter image description here

Если вы нажмете на этот значок <T>, он попросит вас привести пример типа, с которым вы можете создать его экземпляр, и использовать этот тип для автозаполнения. Это может значительно улучшить его эффективность.

1 голос
/ 24 мая 2019
  1. Можете ли вы подтвердить, используете ли вы функцию Microsoft Template Intellisense и включена ли она?
  2. Некоторые из этих проблем, связанных с автозаполнением, были решены / исправлены в версии 15.8-preview5 - используете ли вы более старую версию VS?
  3. Если код работает, я думаю, вам нужно убедиться, что ваша среда VS Code исправлена ​​со всеми необходимыми инструментами.
  4. Переносимость вашего кода C ++ не должна беспокоить, если ваша среда компилятора и все зависимости сохраняются в правильной конфигурации или Makefile, если это необходимо.

-SJ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...