我正在使用模板处理 C++ 中的一些数据结构,但遇到了一些问题。我正在使用链接实现哈希表,还实现了链表。我遇到的第一个问题是模板定义的链接错误,它我通过包含 .cpp
来解决声明所在的文件。
现在我遇到了另一个问题,我不确定它是否与模板或 VS 设置有关。首先,构建项目不会更新它,除非我出于某种原因保存并编译我的入口点.我读了一些问题,设置似乎没问题。
我遇到的最重要的问题是在我的 Hashtable.cpp
中文件 我仅有与我的 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
最佳答案
自动完成被模板弄糊涂了。请记住,当编译器编译模板化代码时,它知道模板参数是什么。相反,当您在模板类中编写代码时,自动完成系统不知道参数是什么。
例如,如果您有 List<T> **arr
和 List
有一个 insert()
方法,是arr[1]->insert(100)
有效的?或许!或者可能不是。可能有 List
的特化对于特定的 T
,它没有 insert
方法。
此外,自动完成系统往往既是一门艺术,也是一门科学,因为它们必须以交互速度运行,并且需要对代码早期的语法错误具有鲁棒性。模板使它们处于最糟糕的境地,因为模板的句法和语法比 C++ 的其他领域要正确得多,因此在处理大量模板化代码时,您往往会看到自动完成表现最差。
在处理高度模板化的代码时,我有时会在处理代码时“去模板化”代码,只是为了帮助编译器。 VS 的最新版本实际上可以帮助您解决这个问题:编译器认为令人困惑的模板可能(通常,但不总是,我不确定为什么)为您提供帮助解决问题的机会:
如果你点击那个<T>
图标,它会要求你给它一个类型的例子,你可以用它来实例化它,并将该类型用于自动完成。这可以显着提高其有效性。
关于c++ - 为什么在我使用模板时 VS 不自动完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56293251/