C++ - 为 std::array of std::array 迭代器创建别名
C++ - creating an alias for an std::array of std::array iterator
我有一个类型为 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>
。
您需要为您的依赖类型添加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) {}
在 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
时,您至少需要像eucledian_closest<3>(myArry)
一样显式提供SIZE
参数。如果不这样做,类型推导将无法推导出 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)
。
其他答案解释了如何更正您的别名。至于功能,我认为有几种方法可以解决这个问题。最简单的方法是对返回值使用类型推导,如果你希望 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) {}
我有一个类型为 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>
。
您需要为您的依赖类型添加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) {}
在 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
时,您至少需要像eucledian_closest<3>(myArry)
一样显式提供SIZE
参数。如果不这样做,类型推导将无法推导出 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)
。
其他答案解释了如何更正您的别名。至于功能,我认为有几种方法可以解决这个问题。最简单的方法是对返回值使用类型推导,如果你希望 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) {}