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

Template Alias failing when I try to use it in a function

本文关键字:函数 别名 失败      更新时间:2023-10-16

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

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