C++ 课堂上使用模板的困惑

C++ 课堂上使用模板的困惑,c++,class,templates,vector,C++,Class,Templates,Vector,我目前正在自学泛型编程以及如何在运行时使用模板声明数据类型。我理解了一个基本示例,在这个示例中,您可以将变量作为模板,以便以后可以创建任何数据类型,但我尝试使用类/向量作为模板: #include <string> #include <vector> #include <iostream> using namespace std; template <class T, class U> class CMap{ private:

我目前正在自学泛型编程以及如何在运行时使用模板声明数据类型。我理解了一个基本示例,在这个示例中,您可以将变量作为模板,以便以后可以创建任何数据类型,但我尝试使用类/向量作为模板:

#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作为模板,它将进入向量数据类型。我也知道我们可以动态地使用insert方法,因为T和U是模板

我不明白的是:

当我声明我的类时,我被告知添加以下内容
我不明白这是怎么回事?当您使用CMap grades语句时,它如何知道第一个参数应该指向向量键,而函数中的第二个参数应该指向向量值;您正在创建CMap类型的对象,其中T的每次出现都替换为string,U的每次出现都替换为int

由于insert方法具有签名void insertT key,U值,因此新创建的对象将使用字符串和int替换T和U,因为这是创建对象时提供的数据类型


你可以使用你喜欢的任何数据类型,包括你自己的类。< /P> < P>让我们先澄清一下在C++中声明模板意味着什么,因为似乎有一些混淆。 模板是什么 模板是创建类的基础,有点像类工厂。模板既不是类也不是类型

您可以按模板声明模板及其将采用的参数,类似于函数将值作为参数的方式

当您将类型作为模板参数传入时,您将实例化模板,从而创建一个类型。当模板被实例化时,您传入的类型将替换相同参数的出现,再次类似于参数传递对函数的作用

template<class T>
class MyTemplateClass
{
public:
    T member;
};
MyTemplateClass<int> var;
实际上是声明您有一个具有2个参数和2个成员变量的模板。键具有类型向量,其中T是第一个模板参数,值具有类型向量,其中U是第二个模板参数

CMap<string, int> grades;
实际上是用CMap类型声明一个可变等级

CMap是CMap的一个实例,使用字符串和int作为参数


grades.key有类型向量,grades.values有类型向量。

好吧,你已经给它们命名了-第一个是T,它接收字符串,第二个是U,它接收int。你如何在运行时使用模板声明数据类型给你的印象是模板可以做到这一点?有什么让人困惑?它的工作原理与函数和参数类似。您有一个模板,当您使用它时,您可以提供参数。。。它不会在运行时发生。@32个参数。您可以为参数提供参数:是的,是的,我的错,模板也是如此。我们用参数声明它们,并使用提供参数,以便用参数替换参数。我希望我做对了=是的,但它怎么知道向量键与类t匹配呢。如果我有更多的私有变量,我不想让它们成为一个template@jimmyspinner按原样申报?国际会员2?
CMap<string, int> grades;