当我使用模板时,为什么 VS 不自动完成?

lae*_*irl 4 c++ templates autocomplete visual-studio

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

现在我遇到了另一个问题,我不确定这是否是与模板或 VS 设置相关的问题。首先,构建项目不会更新它,除非我出于某种原因保存并编译我的入口点。我读一些问题和设置似乎没问题。我遇到的最重要的问题是,在我的文件中,我Hashtable.cpp存在与我的课程相关的任何内容的自动完成问题。List

例如:我List<T> **arrHashtable课堂上使用过,每当我尝试使用任何列表方法时,例如arr[1]->insert(100)它不仅不会自动完成,而且它表示该方法所属的方法,如我在下面的屏幕截图中所示。声明看起来像这样: Hashtable.h:

#pragma once
#include "Log.h"
#include "List.h"
#include <vector>
#include <iostream>
Run Code Online (Sandbox Code Playgroud)

Hashtable.cpp: #include "Hashtable.h"

iostream我的列表类除了等之外没有任何特别的内容

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

我提到的截图

Sne*_*tel 6

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

例如,如果你有List<T> **arr并且List有一个insert()方法,它arr[1]->insert(100)有效吗?或许!或者可能不是。可能有List特定的的专门化T,它没有insert方法。

此外,自动完成系统往往既是一门艺术,也是一门科学,因为它们必须以交互速度运行,并且需要对代码中早期的语法错误具有鲁棒性。模板将它们置于最糟糕的境地,因为模板的语法和语法比 C++ 的其他领域要正确得多,因此在使用大量模板化的代码时,您往往会看到自动完成的表现最糟糕。

在处理大量模板化的代码时,我有时会在处理代码时“去模板化”代码,只是为了帮助编译器解决问题。VS 的最新版本实际上会帮助你解决这个问题:编译器发现令人困惑的模板可能(通常但并非总是如此,我不确定为什么)为你提供了帮助它的机会:

在此输入图像描述

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