在课堂中使用模板中的混乱
Confusion in using templates in class
我当前正在教我/学习通用编程以及如何使用templates
在运行时声明数据类型。我理解了一个基本示例,您可以在其中制作变量一个模板,以便您以后可以进行任何数据类型,但是这里是我尝试使用类/vector的模板:
#include <string>
#include <vector>
#include <iostream>
using namespace std;
template <class T, class U>
class CMap{
private:
vector<T> keys;
vector<U> values;
public:
void insert(T key, U value){
keys.push_back(key);
values.push_back(value);
}
void get(int n){
cout << keys[n] << " values ->" << values[n];
}
};
int main(){
CMap<string, int> grades;
grades.insert("Jones", 12);
grades.insert("Smith", 40);
grades.get(0);
cout << endl;
grades.get(1);
cout << endl;
}
我知道我们创建了T
和U
作为模板,该模板将进入vector
数据类型。我也知道我们可以动态使用insert
方法,因为T
和U
是模板。
我不明白:
当我声明我的课时,我被告知添加以下<string, int>
我不明白这在做什么?它如何知道第一个参数应该转到vector<t> keys
,而<>
内的第二个参数应转到vector<u> values
-如果是它在做什么?
使用语句CMap<string, int> grades;
时,您正在创建类型CMAP的对象,其中每次出现T
的每次出现都被string
替换,并且每次出现U
的出现都被int
替换。
由于您的插入方法具有签名void insert(T key, U value)
,因此您新创建的对象将采用string
和int
替换T
和U
,因为这是您创建对象时提供的数据类型。
您可以将您喜欢的任何数据类型用于T
和U
,包括您自己的类。
让我们首先清除在C 中声明模板的含义,因为似乎有些混乱。
什么模板是
模板是您创建类的东西,就像一类工厂一样。模板是不是类别或类型。
您声明了一个模板及其将通过template<class T, class U /* ... */>
采取的参数,类似于函数将值作为参数的方式。
当您将类型作为模板参数传递时,您实例化模板,从而创建类型。当实例化模板时,您输入的类型将替换相同参数的出现,同样,类似于参数传递与函数的方式相似。
template<class T>
class MyTemplateClass
{
public:
T member;
};
MyTemplateClass<int> var;
在此示例中,MyTemplateClass
是模板,它是不是类型。
MyTemplateClass<int>
是一种类型,恰好具有int
类型的成员变量。我们说MyTemplateClass<int>
是MyTemplateClass
的实例化。MyTemplateClass
中T
的每一次出现都被MyTemplateClass<int>
中的int
替换。
由于MyTemplateClass<int>
只是一种类型,最后一行只是一个变量声明,因此var
只是类型MyTemplateClass<int>
的变量。
这一切都发生在compile time,不是运行时。
编译器确切地知道MyTemplateClass<int>
是什么,并且确切知道其中的类型,并且确切知道代码应编译为什么。
回答您的问题
在您的情况下
template<class T, class U>
class CMap{
private:
vector<T> keys;
vector<U> values;
//...
};
确实声明您的模板具有2个参数,并且具有2个成员变量。keys
具有类型vector<T>
,其中T
是第一个模板参数,而values
具有vector<U>
类型U
是第二个模板参数。
CMap<string, int> grades;
确实在宣布使用类型CMap<string, int>
的变量grades
。
CMap<string, int>
是用string
和int
作为参数的CMap
的实例化。
grades.keys
具有类型vector<string>
和grades.values
类型vector<int>
。
- 如何克服提升精神AST混乱
- 整数类型应该显式转换(例如"int"到"无符号")还是只会增加混乱?
- std::result_of语法混乱
- 使用具有默认参数的函数模板进行 decltype 会使结果混乱(一个有趣的问题或 gcc 的错误)
- C++中多线程的混乱
- Arduino LCD 显示屏显示混乱的字母
- 在MSDOS编译器上,用大于最大值的值初始化int时输出混乱
- 库设计混乱.. "public"/"private"(模板)标题,库文件..?
- 如何在课堂上重用和重新初始化 c++ discrete_distribution?
- 在课堂上创建了一个朋友,给出"无输入文件"错误
- 常量指针上的混乱
- 智能手机代码厨师问题逻辑混乱
- C++来自课堂的内存数据?
- 数组和指针使算术混乱
- C++智能指针混乱
- 部分课堂上的互斥体
- 双链表混乱
- 课堂上的一行,使整个应用程序坏了. 0xC000005错误
- 如何在课堂上正确使用升压通道(和光纤)?
- 在课堂中使用模板中的混乱