在推导模板模板形参时,模板实参推导始终不推导别名模板。是什么意思?请给出对应代码
时间: 2024-03-26 07:41:26 浏览: 42
模板匹配代码
这句话的意思是:在进行模板实参推导时,如果模板形参是一个别名模板,则不会对其进行推导。也就是说,在模板实例化时,如果模板形参是一个别名模板,则实参的类型不会被推导,而是直接使用别名模板的名称来进行实例化。
下面是一个示例代码,说明这个问题:
```cpp
template<typename T>
using AliasTemplate = std::vector<T>;
template<typename T>
void func(T t, AliasTemplate<T> at) {}
int main() {
std::vector<int> vec{1, 2, 3};
func(1, vec); // 编译通过
func(vec, vec); // 编译失败,因为 at 无法推导出实参类型
return 0;
}
```
在上面的代码中,`AliasTemplate` 是一个别名模板,它将 `std::vector` 重命名为 `AliasTemplate`。在调用 `func` 函数时,第一个实参是 `1`,可以被推导为 `int` 类型,而第二个实参是 `vec`,它是一个 `std::vector<int>` 类型,也可以被推导为 `AliasTemplate<int>` 类型。但是,当我们尝试将 `vec` 作为第一个实参传入 `func` 时,由于 `AliasTemplate` 是一个别名模板,无法被推导出实参类型,导致编译失败。
阅读全文