解释template <class M>
时间: 2023-09-30 07:02:56 浏览: 48
template <class M>是一个C++语言中的模板声明语句。
其中,template是C++中定义模板的关键字,用于声明一个模板类或模板函数。
<class M>是模板参数列表,用于指定模板中的参数类型。在这个例子中,M是一个类型参数,可以是任何类型。
使用这个模板声明语句可以定义一个支持任意类型M的类或函数。在定义时,需要在类名或函数名后面加上尖括号,指定M的具体类型。例如:
```
template <class M>
class MyClass {
public:
M value;
MyClass(M val) : value(val) {}
void print() { cout << value << endl; }
};
int main() {
MyClass<int> obj1(42);
obj1.print();
MyClass<string> obj2("Hello");
obj2.print();
return 0;
}
```
这个程序定义了一个模板类MyClass,它有一个类型参数M和一个数据成员value。构造函数通过参数初始化value。print函数用于输出value的值。在main函数中,我们分别用int和string类型的参数创建了两个MyClass对象,并输出了它们的value值。
相关问题
template<class T> class MyTemplateClass { public: MyTemplateClass(const T& data) : m_data(data) {} T t; QMap<QString,QVector<T>>t_map; QCache<QString,QVector<T>>t_cache; private: T m_data; };的实现
以下是 MyTemplateClass 的实现代码:
```c++
#include <QMap>
#include <QVector>
#include <QCache>
template<class T>
class MyTemplateClass {
public:
// 构造函数,初始化数据成员
MyTemplateClass(const T& data) : t(data) {}
// 公有数据成员
T t;
QMap<QString, QVector<T>> t_map;
QCache<QString, QVector<T>> t_cache;
private:
// 私有数据成员
T m_data;
};
```
在这个实现中,MyTemplateClass 是一个模板类,使用了一个类型参数 T,它可以代表任意类型。构造函数接收一个类型为 T 的参数 data,并将其存储在私有数据成员 m_data 中。公有数据成员 t、t_map 和 t_cache 分别是 T 类型、QMap 类型和 QCache 类型的变量,用于存储不同类型的数据。由于这些数据成员都是公有的,可以直接通过对象访问它们。
template <class T> class myTemp { public: void m(); // …… }; void myTemp :: m() { /* m’s body */ }
这段代码存在一个语法错误,具体来说是在定义myTemp类的成员函数m时,没有指定类模板参数T,将导致编译错误。
在C++中,当类被声明为模板类时,成员函数的定义必须在类模板定义内部进行,或者在类模板定义外部通过指定类模板参数进行显式实例化。如果在类模板定义外部定义成员函数,必须指定类模板参数,以告诉编译器该成员函数属于哪个类模板。
修复这个错误的方法是,在定义myTemp类的成员函数m时,指定类模板参数T,例如:
```
template <class T>
class myTemp {
public:
void m(); // ……
};
template <class T>
void myTemp<T>::m() {
/* m’s body */
}
```
在这个修改后的代码中,定义myTemp类的成员函数m时,指定了类模板参数T,使得编译器知道该成员函数属于哪个类模板。同时,在类模板定义外部通过显式实例化也可以定义成员函数,例如:
```
template <class T>
class myTemp {
public:
void m(); // ……
};
template <class T>
void myTemp<T>::m() {
/* m’s body */
}
// 显式实例化
template class myTemp<int>;
```
在这个修改后的代码中,使用了显式实例化来定义myTemp类的成员函数m,指定了类模板参数为int,表示将myTemp<int>实例化为一个具体的类,该类包含了成员函数m的定义。