当我尝试在函数中使用模板别名失败时

时间:2014-10-26 16:00:47

标签: c++ templates c++11

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

#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的位置,那么错误来自何处?我该怎么办呢?

2 个答案:

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