我正在尝试使用模板类型别名,但是在函数中使用它时,我的想法失败了,如下例所示:
#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
的位置,那么错误从哪里来?我应该如何解决这个问题? 最佳答案
using X = Y
和using vec_T = std::vector<T>;
之间的区别在于,前者是类型别名,后者是别名模板(或模板别名,无论如何。)第一种形式本质上是typedef。第二种形式不会自动替换T
。您需要专门化它。您在尖括号<>
之间放置的内容将替换别名模板中的T
。 vec_T<int>
变为std::vector<int>
。
§14.6 / 2
当template-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;
关于c++ - 当我尝试在函数中使用模板别名时失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26574926/