C ++ - 为std :: array iterator的std :: array创建别名

时间:2016-09-30 22:22:23

标签: c++ templates iterator alias

我有一个std::array<Point, SIZE>::iterator类型的迭代器数组,其中SIZE是模板变量。

因此,拥有这些迭代器的数组将是

std::array<std::array<Point, SIZE>::iterator, SIZE> 

写入我拥有的函数数量是一件痛苦的事。

我在想这种类型的别名,但我不知道如何使用模板变量SIZE

我试过

template<std::size_t SIZE>
using p_iterators = std::array<std::array<Point, SIZE>::iterator, SIZE>;

在我做的功能中:

template<std::size_t SIZE>
template <typename T>
p_iterators<SIZE> eucledian_closest(T &points) {}

我收到了这些错误:

closest_pair.cpp:24:70: error: type/value mismatch at argument 1 in template parameter list for ‘template<class _Tp, long unsigned int _Nm> struct std::array’
 using p_iterator = std::array<std::array<Point, SIZE>::iterator, SIZE>;
                                                                      ^
closest_pair.cpp:24:70: error:   expected a type, got ‘std::array<Point, SIZE>::iterator’
closest_pair.cpp:42:1: error: ‘p_iterator’ does not name a type
 p_iterator<SIZE> eucledian_closest(T &points) {

我不知道如何在函数template <typename T>中使用另一个模板时为这种类型添加别名,甚至不知道如何使用该模板。

3 个答案:

答案 0 :(得分:2)

在C ++中,dependent模板类型名称需要关键字typename

您应该从

更改别名
template<std::size_t SIZE>
using p_iterators = std::array<std::array<Point, SIZE>::iterator, SIZE>;

template<std::size_t SIZE>
using p_iterators = std::array<typename std::array<Point, SIZE>::iterator, SIZE>;

然后将模板函数签名更改为:

template<std::size_t SIZE, typename T>
p_iterators<SIZE> eucledian_closest(T &points) {}

在上述情况下,在调用函数eucledian_closest时,您至少需要明确提供SIZE参数,例如eucledian_closest<3>(myArry)。如果不这样做,类型演绎将无法推断SIZE,加上缺点是您应该具有匹配的大小。如果您希望类型扣除为您隐式推导SIZE

您可以执行以下操作:

template<template <typename, std::size_t> class Array,
                                          typename T,
                                          std::size_t SIZE
        >
p_iterators<SIZE> eucledian_closest(Array<T, SIZE>& points) {}

通过上述内容,您可以执行eucledian_closest(myArray)。但是,如果您不需要在函数中使用SIZE,则只需执行

即可
template<typename T>
auto eucledian_closest(T& points) {}

简单地称之为eucledian_closest(myArray)

答案 1 :(得分:0)

您需要为依赖类型添加typename

template<std::size_t SIZE>
std::array<typename std::array<Point, SIZE>::iterator, SIZE>

顺便说一句,以下函数模板没有任何意义:

template<std::size_t SIZE>
template <typename T>
p_iterators<SIZE> eucledian_closest(T &points) {}

您可能只有一个免费功能模板的模板参数列表,您可能需要

template<std::size_t SIZE, typename T>
p_iterators<SIZE> eucledian_closest(T &points) {}

答案 2 :(得分:0)

其他答案解释了如何更正别名。至于功能,我认为有几种方法可以解决这个问题。最简单的方法是对返回值使用类型推导,如果你希望T是std :: array类型,你可以应用它:

template <typename T>
auto euclidean_closest(T& points) { 
  // some code
  T some_arr;  // the compiler will know what size to use
  return some_arr;
}

如果您需要提供SIZE,可以使用:

template <typename T, size_t SIZE>
p_iterators<SIZE> euclidean_closest(T& points) {}