为什么使用模板时,VS没有自动完成功能?

4

我正在使用模板在C++中处理一些数据结构,遇到了一些问题。我正在实现一个使用链接的哈希表,并且我还实现了一个链表。我遇到的第一个问题是我的模板定义出现了链接错误,通过包含声明的.cpp文件解决了这个问题。

现在我遇到了另一个问题,我不确定它是否与模板相关或者可能是VS设置的问题。首先,在没有保存并编译我的入口点的情况下,构建项目不会进行更新。我读了一些问题,设置似乎没问题。最重要的问题是,在我的Hashtable.cpp文件中,我有关于我的List类的自动完成问题。

例如: 我在我的Hashtable类中使用了List<T> **arr,每当我尝试使用任何列表方法,比如arr [1]-> insert(100),它不仅不会自动完成,而且它显示方法属于的对象,如下面的截图所示。 声明看起来像这样: Hashtable.h

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

Hashtable.cpp#include“ Hashtable.h”

我的列表类别没有包含任何特殊的东西,只有 iostream 等。

我想指出的是,这段代码没有自动完成,但它可以运行正确的方法,但使用起来确实很不舒服和烦人。此外,我担心它在另一台计算机上可能无法正常工作,这对我来说真的很重要。 你有什么想法吗?

我提到的截图链接


1
依赖类型很难自动完成。 - Guillaume Racicot
@Galik 是的,实际上这会是一个我没有考虑过的小问题。它不难实现。但我不确定它是否能解决自动完成的问题。 - laegirl
@YosokuDenkai 我刚意识到你没有使用 std::list 而是你自己的类,但这样做是值得的。这并不是解决自动完成问题的方法。 - Galik
Visual Studio (VS) 在这种情况下应该可以自动补全。对于 std::stringstd::vector (以及我的模板),这对我有效,因此我不认为你的模板在自动补全时会出现问题。@GuillaumeRacicot 注意他的情况中没有依赖类型。希望在 C++20 中,概念将变得方便,以便自动完成依赖类型。 - Marek R
3个回答

6
自动完成在处理模板时会变得混乱。请记住,当编译器编译模板代码时,它知道模板参数将是什么。相反,当您在模板类中编写代码时,自动完成系统不知道参数将是什么。
例如,如果您有 List<T> **arr 并且 List 有一个 insert() 方法,那么 arr[1]->insert(100) 是否有效?也许!或者可能不是。可能存在特定 TList 的专门化,它没有 insert 方法。
此外,自动完成系统往往是一门艺术,因为它们需要以交互速度运行,并且需要对代码中较早的语法错误具有鲁棒性。模板使它们处于最糟糕的状态,因为模板的语法和语法比 C++ 的其他领域要棘手得多,因此在使用大量模板化代码时,您往往会看到自动完成表现得最差。

当处理大量模板代码时,我有时会“去模板化”代码,只是为了帮助编译器。最近的VS版本实际上可以帮助你做到这一点:编译器发现混淆的模板可能(通常情况下,但并非总是,我不确定为什么)会提供帮助:

enter image description here

如果您点击那个<T>图标,它会要求您提供一个可能用于实例化的类型示例,并将该类型用于自动完成。这可以显着提高其效果。

我其实不知道,这是我第一次除了简单的函数等之外大量使用模板。 - laegirl

3
新版的Visual Studio有一个功能,可以选择具体类型来实例化给定的模板,以便在其中具有自动完成功能。

enter image description here

在VS2017中,您必须手动输入这些内容。在VS2019中,您可以从模板的实际实例列表中进行选择。
如果没有这些提示,Intellisense无法知道Hashtable在成员方面具有什么 - 您可以任意次数地对其进行专门化,arr可以是任何类型,并且clear()可以根据T返回各种内容。它提供的任何建议都可能对不同的模板参数集错误。

我注意到了Visual Assist图标。这是内置功能还是Visual Assist的功能? - drescherjm
它是内置的(这也是我不使用Visual Assist“智能感知”的主要原因,而是使用内置的)。 - Max Langhof
我还没有升级到VS2019,我想这值得我花时间。谢谢你的回答。 - laegirl

0
  1. 请确认您是否正在使用Microsoft模板智能感知功能并已启用?
  2. 在版本15.8-preview5中,已解决/修复了一些与自动完成相关的问题-您是否正在使用较旧的VS版本?
  3. 如果代码可以正常工作,我认为您需要确保您的VS Code环境已经安装了所有必要的工具。
  4. 只要您的编译器环境和所有依赖项都以正确的配置或Makefile的形式保存,您的C++代码的可移植性就不应该成为一个问题。

-SJ


1- 我无法确认那个?因为这是我第一次大量使用模板,所以我不确定它是什么。我猜想它应该是默认值。 2- 我正在使用最新的2017版本,而不是 VS2019 版本。 3- 我已经进行了双重检查,一切正常。 - laegirl
  1. 根据你的情况,下载最新的Visual Studio 2018或2019。要禁用/启用该功能,请转到“工具”>“选项”>“C / C ++”>“高级”>“IntelliSense”>“启用模板智能感知”。
  2. 您可以在此处查看有关Intellisense功能的更多详细信息 https://devblogs.microsoft.com/cppblog/visual-studio-c-template-intellisense-populates-based-on-instantiations-in-your-code/#
- Srikanth J

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接