2016-09-30 29 views
0

我有一個類型爲std::array<Point, SIZE>::iterator的迭代器數組,其中SIZE是一個模板變量。C++ - 爲std :: array迭代器創建一個std ::數組的別名

所以具有這些迭代器的陣列將是

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>中使用另一個模板的同時使用該模板。

+0

'template '' – 0x499602D2

回答

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)

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) {} 
0

其他答案解釋如何更正你的別名。至於功能,我認爲有幾種方法可以解決這個問題。最簡單的一種是使用類型扣除返回的值,如果你希望牛逼是的std ::數組類型的可以申請:

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

如果您需要提供的大小,你可以使用:

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