为什么在我使用模板时 VS 不自动完成?
Why doesn't VS autocomplete when I am using templates?
我正在使用模板在 C++ 中处理一些数据结构,我 运行 一些 problems.I 正在使用链接实现哈希表,我还实现了链接 List.The 第一个问题我 运行 是我的模板定义的链接错误,我通过包含声明所在的 .cpp
文件解决了这个错误。
现在我 运行 另一个问题,我不确定它是与模板相关的问题还是与 VS settings.First 相关的问题,构建项目不会更新它,除非我保存并为一些 reason.I 阅读一些问题编译我的入口点,设置似乎没问题。
我 运行 遇到的最重要的问题是,在我的 Hashtable.cpp
文件中,我有关于 仅 与我的 List
class 相关的任何内容的自动完成问题].
例如:
我在我的 Hashtable
class 中使用了 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"
我的列表 class 除了 iostream
等之外没有任何特别内容
我想指出代码不会自动完成但它可以工作,它运行正确的方法但是工作真的很不舒服和烦人with.Also我担心它可能无法在另一个对我来说真的很重要的电脑。
你知道哪里出了问题吗?
截图我mentioned
自动完成被模板搞糊涂了。请记住,当编译器编译模板化代码时,它知道模板参数是什么。相反,当您在模板化 class 中编写代码时,自动完成系统不知道参数是什么。
例如,如果您有 List<T> **arr
并且 List
有一个 insert()
方法,那么 arr[1]->insert(100)
有效吗?可能是!或者可能不是。对于没有 insert
方法的特定 T
,可能有 List
的特化。
此外,自动完成系统往往既是一门艺术,也是一门科学,因为它们必须 运行 以交互速度进行,并且需要对代码早期的语法错误具有鲁棒性。模板使它们处于最糟糕的状态,因为模板的句法和语法比 C++ 的其他领域更难正确处理,因此在使用大量模板化代码时,您往往会看到自动完成表现最差。
在处理大量模板化代码时,我有时 "de-templated" 处理代码只是为了帮助编译器。 VS 的最新版本实际上可以帮助您解决这个问题:编译器认为令人困惑的模板可能(通常,但不总是,我不确定为什么)为您提供帮助解决问题的机会:
如果您单击那个 <T>
图标,它会要求您提供一个类型示例,您可以用它实例化它,并使用该类型进行自动完成。这可以显着提高其有效性。
- 您能否确认您是否正在使用 Microsoft Template Intellisense 功能并且已启用?
- 其中一些与自动完成相关的问题已 resolved/fixed 在版本 15.8-preview5 中 - 您使用的是旧版本的 VS 吗?
- 如果代码有效,我认为您需要确保您的 VS Code 环境已修复,所有必要的工具都已到位。
- 只要您的编译器环境和所有依赖项都保留在正确的配置或必要的 Makefile 中,您的 C++ 代码的可移植性就不是问题。
-SJ
较新版本的 Visual Studio 有一个功能,您可以 select 具体类型来实例化给定模板,以实现自动完成功能:
在 VS2017 中,您必须手动输入这些内容。在 VS2019 中,您可以 select 从您所在模板的实际实例化列表中。
如果没有这些提示,Intellisense 就没有机会知道 Hashtable<T>
在成员方面有什么 - 你可以对它进行任意多次特化,arr
可以有任何类型,并且 clear()
可以 return 各种取决于 T
的事情。对于不同的模板参数集,它给出的任何建议都可能是错误的...
我正在使用模板在 C++ 中处理一些数据结构,我 运行 一些 problems.I 正在使用链接实现哈希表,我还实现了链接 List.The 第一个问题我 运行 是我的模板定义的链接错误,我通过包含声明所在的 .cpp
文件解决了这个错误。
现在我 运行 另一个问题,我不确定它是与模板相关的问题还是与 VS settings.First 相关的问题,构建项目不会更新它,除非我保存并为一些 reason.I 阅读一些问题编译我的入口点,设置似乎没问题。
我 运行 遇到的最重要的问题是,在我的 Hashtable.cpp
文件中,我有关于 仅 与我的 List
class 相关的任何内容的自动完成问题].
例如:
我在我的 Hashtable
class 中使用了 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"
我的列表 class 除了 iostream
等之外没有任何特别内容
我想指出代码不会自动完成但它可以工作,它运行正确的方法但是工作真的很不舒服和烦人with.Also我担心它可能无法在另一个对我来说真的很重要的电脑。 你知道哪里出了问题吗?
截图我mentioned
自动完成被模板搞糊涂了。请记住,当编译器编译模板化代码时,它知道模板参数是什么。相反,当您在模板化 class 中编写代码时,自动完成系统不知道参数是什么。
例如,如果您有 List<T> **arr
并且 List
有一个 insert()
方法,那么 arr[1]->insert(100)
有效吗?可能是!或者可能不是。对于没有 insert
方法的特定 T
,可能有 List
的特化。
此外,自动完成系统往往既是一门艺术,也是一门科学,因为它们必须 运行 以交互速度进行,并且需要对代码早期的语法错误具有鲁棒性。模板使它们处于最糟糕的状态,因为模板的句法和语法比 C++ 的其他领域更难正确处理,因此在使用大量模板化代码时,您往往会看到自动完成表现最差。
在处理大量模板化代码时,我有时 "de-templated" 处理代码只是为了帮助编译器。 VS 的最新版本实际上可以帮助您解决这个问题:编译器认为令人困惑的模板可能(通常,但不总是,我不确定为什么)为您提供帮助解决问题的机会:
如果您单击那个 <T>
图标,它会要求您提供一个类型示例,您可以用它实例化它,并使用该类型进行自动完成。这可以显着提高其有效性。
- 您能否确认您是否正在使用 Microsoft Template Intellisense 功能并且已启用?
- 其中一些与自动完成相关的问题已 resolved/fixed 在版本 15.8-preview5 中 - 您使用的是旧版本的 VS 吗?
- 如果代码有效,我认为您需要确保您的 VS Code 环境已修复,所有必要的工具都已到位。
- 只要您的编译器环境和所有依赖项都保留在正确的配置或必要的 Makefile 中,您的 C++ 代码的可移植性就不是问题。
-SJ
较新版本的 Visual Studio 有一个功能,您可以 select 具体类型来实例化给定模板,以实现自动完成功能:
在 VS2017 中,您必须手动输入这些内容。在 VS2019 中,您可以 select 从您所在模板的实际实例化列表中。
如果没有这些提示,Intellisense 就没有机会知道 Hashtable<T>
在成员方面有什么 - 你可以对它进行任意多次特化,arr
可以有任何类型,并且 clear()
可以 return 各种取决于 T
的事情。对于不同的模板参数集,它给出的任何建议都可能是错误的...