我正在尝试使用模板类型别名,但是在函数中使用它时,我的想法失败了,如下例所示:

#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 = Yusing vec_T = std::vector<T>;之间的区别在于,前者是类型别名,后者是别名模板(或模板别名,无论如何。)第一种形式本质上是typedef。第二种形式不会自动替换T。您需要专门化它。您在尖括号<>之间放置的内容将替换别名模板中的Tvec_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/

10-11 19:45
查看更多