void print(T,C) { cout << "T,C" << endl; } template<class C> void print<int*,C>(int*,C) { cout << "int*,C" << endl; }为什么是非法使用显示模板参数
时间: 2024-09-17 15:05:47 浏览: 44
cpp代码-模板 泛型 template<typename> template<class>
上述代码中的 `print` 函数模板有两个版本,其中一个接受两个模板参数 `T` 和 `C`,而另一个只接受一个模板参数 `C`,但是限定类型为 `int*`。在这个例子中,`void print<int*,C>(int*,C)` 的部分被认为是非法使用显示模板参数,原因有两点:
1. **隐式模板参数**:第一个 `print` 函数模板并未明确指明 `T` 类型,因此 `T` 应该是一个默认模板参数,用户无需显式指定。然而,在第二个模板版本中,`T` 已经被显式指定为 `int*`,这是不允许的,因为这里的 `T` 被 `int*` 具体化了,而非留给用户去选择。
2. **多余的模板参数**:对于 `void print<T,C>` 这个模板,`C` 是通用的模板参数。但在 `void print<int*,C>(int*,C)` 版本中,`C` 参数已经作为第二个参数出现,而且前面还出现了 `int*`,这实际上是一个冗余的模板参数,因为你可以在第一个位置就指定 `C` 类型。
正确的做法应该是去掉 `int*`,让 `T` 成为用户可选的具体类型,或者将 `C` 移到 `T` 后面,并在第一个版本中明确指定 `T`。修复后的代码可能是这样的:
```cpp
template <typename T, class C>
void print(T, C) {
cout << "T,C" << endl;
}
// 或者
template <class C>
void print<int*, C>(int*, C) {
cout << "int*,C" << endl;
}
```
阅读全文