解释template <class M>
时间: 2023-09-30 19:03:08 浏览: 40
这是C++中的模板声明语法,其中<class M>是模板参数列表,表示M是一个类型参数。在函数或类的定义中,可以使用M作为类型的占位符,以便在调用时根据实际需要进行类型的替换。例如,template<class T> void swap(T& a, T& b)是一个模板函数,可以用于交换两个任意类型的变量。
相关问题
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的定义。