模板别名失败,当我尝试在函数中使用它时
Template Alias failing when I try to use it in a function
我正在尝试使用模板类型别名,但是当我在函数中使用它时,我的想法失败了,如下例所示:
#include <iostream>
#include <vector>
template <typename T>
using vec_T = std::vector<T>;
template <typename T>
T sum_vector(vec_T vec) // T sum_vector(std::vector<T> vec)
{
T sum = 0;
typename vec_T::iterator it; // typename std::vector<T>::iterator it;
for (it = vec.begin(); it != vec.end(); ++it)
{
sum += *it;
}
return sum;
}
编译上述代码失败,并显示以下错误:
错误:"T sum_vector"T sum_vector(vec_T vec( 的模板声明
错误:在"vec"T sum_vector(vec_T 之前缺少模板参数 维克(
如果我使用注释行代替,代码工作正常。我真的不明白我在这里错过了什么,我的理解是using X = Y
之后,编译器只会Y
放在我X
的地方,那么错误从何而来?我应该如何解决这个问题?
using X = Y
和 using vec_T = std::vector<T>;
之间的区别在于前者是类型别名,后者是别名模板(或模板别名,等等(。第一种形式本质上是一个 typedef。第二种形式不会自动替换T
。你需要专门化它。在别名模板中,您放在尖括号<>
之间的内容将替换为T
。 vec_T<int>
变得std::vector<int>
.
§ 14.6/2
当模板 ID 引用别名的专用化时 模板,它相当于由 将其模板参数替换为模板参数 在别名模板的类型 ID 中。
template<class T> struct Alloc { /∗ ... ∗/ }; template<class T> using Vec = vector<T, Alloc<T>>; Vec<int> v; // same as vector<int, Alloc<int>> v;
你必须使用
template <typename T>
T sum_vector(vec_T<T> vec)
在您的情况下,您可以通过常量引用进行论证:
template <typename T>
T sum_vector(const vec_T<T>& vec)
相关文章:
- 使用定义函数模板别名
- 如何同时别名和实例化模板函数?
- 通过类型别名从构造函数转发模板推导
- typedef 别名的析构函数
- 函数的返回值类型是别名 ***或 *** 布尔值
- std::shared_ptr 使用别名构造函数,是否可以检索初始指针值?
- 使用其他模板类型参数作为要在函数签名中使用的类型别名声明
- 在模板派生类中继承具有类型别名的构造函数
- 模板类函数指针类型别名
- 使用函数数据类型键入别名和别名模板
- 是否可以为模板类的模板函数成员设置别名?
- 类方法和全局函数中的别名
- 别名一个模板函数,该功能没有参数可更简洁
- MSVC:带函数的"error C2244: unable to match function definition to an existing declaration"是指专用模板类的类型别名
- Cython 创建 C 函数别名
- 需要有关函数别名的帮助
- 函数别名,适用于头文件
- 创建函数别名
- C++11 模板函数别名与包装器
- C++模板函数别名为可变参数模板参数