#include<iostream> using namespace std; /* template <class/typename 类型参数1, class 类型参数2, ...> 返回值类型 模板名(形参表) { 函数体 } */ template<typename T> //typename可以用class替换 T Add(const T& left, const T& right) { return left + right; } T* func(int n) { return new T[n]; } int main() { int a1 = 10, a2 = 20; double d1 = 10.0, d2 = 20.0; //显示实例化 int c=Add<int>(a1, d1); //double隐式类型转换成int int d=Add<double>(a1, d2); //函数模板显示实例化 cout<< c << endl<< d <<endl; //int* p=func(10); ----这里会报错,需要函数模板显示实例化 int* p1 = func<int>(10); double* p2 = func<double>(10); //如果函数模板不能自动推演,就要显示实例化,指定模板参数。 } 这个代码哪里错了
时间: 2024-04-01 18:33:33 浏览: 65
这个代码没有明显的语法错误,但是有一些需要注意的地方:
1. 在函数模板 Add 中,如果 left 和 right 的类型不一致时,会发生隐式类型转换。这里将 double 类型隐式转换成 int 类型,可能会导致精度损失,需要注意。
2. 在调用函数模板 Add 时,可以使用显示实例化或者自动推演。这里使用了显示实例化,但是模板参数的类型和实参的类型不匹配,也可能导致精度损失。
3. 在调用函数模板 func 时,如果不进行显示实例化,编译器不能自动推演出模板参数的类型,会导致编译错误。
相关问题
#include <iostream> #include <vector> namespace my_std { using std::cin; using std::cout; using std::endl; using std::swap; using std::vector; } using namespace my_std; class MySort { public: /*选择排序*/ template<typename T> void SelectionSort(vector<T> &arr); }; void (SelectionPtr) (vector<int>) = &MySort::SelectionSort<vector<int>>; //指针函数
这段代码中定义了一个名为MySort的类,其中包含一个模板函数SelectionSort,用于对传入的vector进行选择排序。接着定义了一个函数指针SelectionPtr,指向了MySort类中SelectionSort函数的实例化版本,即对vector<int>进行排序的版本。由于函数指针的语法比较复杂,可以将其定义简化为:
```
using SelectionPtr = void (MySort::*)(vector<int>&);
```
这样就可以更清晰地看出SelectionPtr是一个指向MySort类的成员函数的指针,该成员函数接受一个vector<int>的引用作为参数,返回值为void。
下面这段代码的错误是什么#include <iostream> #include <vector> namespace my_std { using std::cin; using std::cout; using std::endl; using std::swap; using std::vector; } using namespace my_std; class MySort { public: /选择排序/ template<typename T> void SelectionSort(vector<T> &arr); }; void (SelectionPtr) (vector<int>) = &MySort::SelectionSort<vector<int>>; //指针函数
这段代码存在一个类型不匹配的错误。具体来说,`SelectionPtr` 的定义中,成员函数 `MySort::SelectionSort` 接受的参数类型为 `vector<T>&`,而指针变量 `SelectionPtr` 的类型为 `void (*)(vector<int>)`,两者的参数类型并不匹配。
为了解决这个错误,需要将 `SelectionPtr` 的类型定义修改为能够匹配 `MySort::SelectionSort` 函数的类型。具体来说,可以将 `SelectionPtr` 的类型定义为:
```
using SelectionPtr = void (MySort::*)(vector<int>&);
```
这样,`SelectionPtr` 就成为了一个指向 `MySort::SelectionSort` 函数的指针类型,该函数接受一个 `vector<int>&` 类型的引用作为参数,返回值为 `void`。然后,将 `SelectionPtr` 指向 `MySort::SelectionSort<vector<int>>` 的实例化版本即可:
```
SelectionPtr ptr = &MySort::SelectionSort<int>; // 指向 MySort::SelectionSort<vector<int>> 的指针
```
这样就可以消除类型不匹配的错误了。
阅读全文