模版类,在类里声明,在类外面定义的成员函数为什么必须加template
时间: 2023-07-10 22:08:15 浏览: 41
在类模板中,类的成员函数如果在类外面进行定义时,需要在函数名前加上类模板的参数列表。这是因为类模板的参数列表在类外面的成员函数定义中并不会自动推导,因此需要手动指定。
例如,如果有如下的模板类:
```cpp
template <typename T>
class MyClass {
public:
void myFunc(T arg);
};
```
在类外面定义 myFunc 函数时,需要加上类模板的参数列表:
```cpp
template <typename T>
void MyClass<T>::myFunc(T arg) {
// ...
}
```
这样才能正确指定模板参数 T。如果不加 template,则编译器会认为 myFunc 是一个普通的非模板函数,而无法匹配到 MyClass<T> 中的函数声明。
相关问题
template在类外,在类中声明重载函数如何指定模板参数H和W
如果在类外定义带有模板参数的成员函数,可以使用以下语法来指定`Screen`类的模板参数`H`和`W`:
```
template <size_t H, size_t W>
std::ostream& operator<< (std::ostream& os, const Screen<H, W>& screen)
{
// 函数实现
}
```
其中,`template <size_t H, size_t W>`表示该函数是一个带有模板参数的函数模板,`std::ostream&`表示返回值类型,即重载后的输出流运算符的返回值类型,`operator<<`表示重载的运算符,`const Screen<H, W>&`表示传递给函数的`Screen`对象是一个常量引用,`Screen<H, W>`表示使用这两个模板参数实例化的`Screen`类。在这个函数的实现中,可以使用`screen`对象的成员函数和数据成员,实现将`Screen`对象输出到输出流`os`的功能。需要注意的是,如果该函数需要访问类`Screen`的私有成员,需要在类`Screen`中将该函数声明为友元函数。
这个类模板的成员函数该怎么类外定义
类模板的成员函数的类外定义需要注意一些细节。类模板的成员函数定义需要在函数名前加上模板参数列表,以指定该函数属于哪个类模板,并且在函数名后需要加上类模板的实际类型参数,以指定该函数所属的具体实例。例如:
```c++
template<class T, int SIZE>
class MyArray{
public:
void set(int index, T value); // 声明成员函数
};
template<class T, int SIZE>
void MyArray<T, SIZE>::set(int index, T value){
// 类外定义成员函数
// ...
}
```
在这个例子中,set()函数是MyArray类模板的成员函数,它需要在函数名前加上模板参数列表`<class T, int SIZE>`,并在函数名后加上类模板的实际类型参数`<T, SIZE>`,以指定该函数所属的具体实例。在函数体内,可以像普通函数一样使用T和SIZE两个模板参数。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)