修改代码使类的模板为template <typename T> void Swap(T* p1, T* p2){ ... }
时间: 2024-03-18 16:41:41 浏览: 169
好的,这是修改后的代码,使用指针作为函数模板的参数:
```c++
#include <cstring>
template<typename T>
void Swap(T* p1, T* p2) {
T temp = *p1;
*p1 = *p2;
*p2 = temp;
}
template<>
void Swap(char** p1, char** p2) {
char* temp = new char[strlen(*p1) + 1];
strcpy(temp, *p1);
strcpy(*p1, *p2);
strcpy(*p2, temp);
delete[] temp;
}
```
对于大部分类型,我们可以直接使用指针进行交换,但对于C风格字符串(char*)类型的变量,我们需要手动进行内存分配和字符串拷贝,避免指针被重复释放或者内存泄漏等问题。
相关问题
代码namespace std { template <typename T> void swap<Widget<T>>(Widget<T> &a, Widget<T> &b){ a.swap(b); }; };是否正确
不完全正确。应该使用`template <>`显式特化,如下所示:
```
namespace std {
template <typename T>
void swap(Widget<T> &a, Widget<T> &b){
a.swap(b);
};
template <>
void swap<Widget<int>>(Widget<int> &a, Widget<int> &b){
a.swap(b);
};
};
```
在这个例子中,我们特化了`std::swap`函数的模板参数,以便将其应用于`Widget<int>`类型的对象。注意,这个特化必须在命名空间`std`中进行,因为它是一个标准库函数的特化。
template <typename T, template <typename> typename Container>和 template <typename T, template <typename T1> typename Container>分析两个模版的不同,并举例
这两个模板的区别在于模板参数的类型约束:
1. `template <typename T, template <typename> typename Container>` 这里,`Container` 是一个模板模板参数,它接受任意类型的模板参数。这意味着你可以传递任何模板作为 `Container`,例如 `std::vector`, `std::list`, 或者自定义模板等。例如:
```cpp
template<typename T>
struct MyClass {
template<typename U, template<typename> typename C>
void useContainer(C<U>& container) {
// 使用container保存T类型的元素...
}
};
MyClass<int>::useContainer<std::vector>(vec); // vec是一个std::vector<int>
```
2. `template <typename T, template <typename T1> typename Container>` 这里的 `Container` 是一个模板参数,但是它期望接收另一个特定类型的模板作为参数,比如 `T1`。这意味着当你实例化这个模板时,`Container` 只能使用与 `T` 相同类型的模板。例如:
```cpp
template<typename T>
struct MyClass {
template<typename U = T, template<typename> typename C>
void useContainer(C<U>& container) {
// 使用container保存T类型的元素...
}
};
MyClass<int>::useContainer<std::vector>; // 不合法,因为期望U是int,但这里传递的是std::vector本身
```
总结来说,第一个模板更通用,可以用于多种不同类型的容器;而第二个模板则限制了 `Container` 的类型必须依赖于 `T`。在实际应用中,通常会根据需要选择合适的形式。
阅读全文