我正在尝试使用模板类型别名,但是当我在函数中使用它时,我的想法失败了,如下例所示:
#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 VEC)
如果我使用注释行代替代码工作正常。我真的不明白我在这里错过了什么,我的理解是在using X = Y
之后,编译器会将Y
放在我X
的位置,那么错误来自何处?我该怎么办呢?
答案 0 :(得分:3)
你必须使用
template <typename T>
T sum_vector(vec_T<T> vec)
在你的情况下,你可以通过const引用来接受参数:
template <typename T>
T sum_vector(const vec_T<T>& vec)
答案 1 :(得分:3)
using X = Y
和using vec_T = std::vector<T>;
之间的区别在于前者是类型别名,后者是别名模板(或模板别名,无论如何。)第一种形式本质上是一种typedef。第二种形式不会自动替换T
。你需要专门化它。放在尖括号<>
之间的内容将替换别名模板中的T
。 vec_T<int>
变为std::vector<int>
。
§14.6/ 2
当 template-id 引用别名的特化时 模板,它相当于获得的关联类型 将 template-arguments 替换为 template-parameters 在别名模板的 type-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;