为什么我在使用模板时VS无法自动完成?

时间:2019-05-24 13:02:25

标签: c++ visual-studio templates autocomplete

我正在使用模板在C ++中处理某些数据结构,但遇到了一些问题。我正在使用链实现HashTable,并且还实现了链接列表。我运行的第一个问题是模板定义存在链接错误。我通过在声明所在的位置包含.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等外没有任何特殊内容

我想指出的是,该代码不会自动完成,但是可以正常运行,它运行正确的方法,但是使用起来确实很不方便和烦人。我还担心它可能无法在另一台真正重要的计算机上工作对我来说。 您知道什么地方可能出问题吗?

mentioned

的屏幕截图

3 个答案:

答案 0 :(得分:2)

自动完成功能被模板弄糊涂了。请记住,当编译器编译模板代码时,它知道模板参数将是什么。相反,当您在模板化类中编写代码时,自动完成系统不知道参数将是什么。

例如,如果您有List<T> **arr并且Listinsert()方法,那么arr[1]->insert(100)是否有效?也许!或者可能不是。对于特定的List,可能会有T的专门化,但没有insert方法。

此外,由于自动完成系统必须以交互的速度运行,并且需要对代码中的语法错误具有较强的鲁棒性,因此自动完成系统往往与科学一样具有艺术性。模板使它们处于最不利的境地,因为与C ++的其他领域相比,模板的语法和语法要正确得多,因此,在使用大量的模板化代码时,您往往会看到自动完成表现最差。

在使用大量模板化的代码时,有时在处理代码时会“去模板化”代码,只是为了帮助编译器。 VS的最新版本实际上将为您提供帮助:编译器会感到困惑的模板可能(通常但并非总是如此,我不确定为什么)为您提供了帮助的机会:

enter image description here

如果单击该<T>图标,它将要求您提供一个实例化该实例的类型的示例,并将该类型用于自动完成。这样可以大大提高其有效性。

答案 1 :(得分:1)

  1. 您能确认您是否正在使用Microsoft Template Intellisense功能并已启用吗?
  2. 这些与自动完成相关的问题中的一些已在15.8-preview5版本中得到解决/修复-您使用的是旧版VS吗?
  3. 如果代码可以正常工作,我认为您需要确保已安装所有必需的工具来修复VS Code环境。
  4. 只要编译器环境和所有依赖项都保留在正确的配置或必要的Makefile中,就不必担心C ++代码的可移植性。

-SJ

答案 2 :(得分:1)

Visual Studio的较新版本具有一项功能,您可以选择具体类型来实例化给定模板,以使其具有自动完成功能:

enter image description here

在VS2017中,您必须手动输入这些内容。在VS2019中,您可以从所使用模板的实际实例化列表中进行选择。

没有这些提示,Intellisense就没有机会知道Hashtable<T>的成员资格-您可以对其进行多次专门化,arr可以具有任何类型,而{{1} }可以返回各种内容,具体取决于clear()。对于一组不同的模板参数,它给出的任何建议都可能是错误的...