我正在使用模板在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
等外没有任何特殊内容
我想指出的是,该代码不会自动完成,但是可以正常运行,它运行正确的方法,但是使用起来确实很不方便和烦人。我还担心它可能无法在另一台真正重要的计算机上工作对我来说。 您知道什么地方可能出问题吗?
的屏幕截图答案 0 :(得分:2)
自动完成功能被模板弄糊涂了。请记住,当编译器编译模板代码时,它知道模板参数将是什么。相反,当您在模板化类中编写代码时,自动完成系统不知道参数将是什么。
例如,如果您有List<T> **arr
并且List
有insert()
方法,那么arr[1]->insert(100)
是否有效?也许!或者可能不是。对于特定的List
,可能会有T
的专门化,但没有insert
方法。
此外,由于自动完成系统必须以交互的速度运行,并且需要对代码中的语法错误具有较强的鲁棒性,因此自动完成系统往往与科学一样具有艺术性。模板使它们处于最不利的境地,因为与C ++的其他领域相比,模板的语法和语法要正确得多,因此,在使用大量的模板化代码时,您往往会看到自动完成表现最差。
在使用大量模板化的代码时,有时在处理代码时会“去模板化”代码,只是为了帮助编译器。 VS的最新版本实际上将为您提供帮助:编译器会感到困惑的模板可能(通常但并非总是如此,我不确定为什么)为您提供了帮助的机会:
如果单击该<T>
图标,它将要求您提供一个实例化该实例的类型的示例,并将该类型用于自动完成。这样可以大大提高其有效性。
答案 1 :(得分:1)
-SJ
答案 2 :(得分:1)