-1

我有这个功能:

std::vector<std::pair<std::vector<int>::iterator, std::vector<int>::iterator> > 
split(    const std::vector<int>& vector,size_t slices){

...

}

并且由于它非常冗长,并且我将来可能需要拆分其他类型的向量,因此我想使其基于模板,但是这次尝试失败了:

 template<typename T> 
  std::vector<std::pair< std::vector<T>::iterator, std::vector<T>::iterator> >
  split( const std::vector<T>& vector, size_t slices) 

    ...

 }

我可以看到有两个问题: 1 - 我不能使用矢量或地图或列表,只能使用矢量。2 - 我还没有很好地理解模板缩减的东西。

任何解释表示赞赏。

4

3 回答 3

1

1 - 我不能使用矢量、地图或列表,[...]

如果你想处理所有的容器,那么你不应该std::vector首先使用模板(你也不应该命名你的函数参数vector):

template<typename C>
std::vector<std::pair<typename C::iterator, typename C::iterator>>
split(C const& cont, size_t slices)
{
    ...
}

还要注意typename关键字的使用,这在指定限定的依赖类型名称时是必需的。

于 2013-02-25T16:42:35.810 回答
1
template<typename T> 
  std::vector<std::pair< typename T::iterator, typename T::iterator> >
  split( const T& vector, size_t slices) 

    ...

 }

你不见了typename,你可以替换容器的类型。

于 2013-02-25T16:43:00.770 回答
0

你错过了typename

template<typename T>
std::vector<
    std::pair<
        typename std::vector<T>::iterator,
        typename std::vector<T>::iterator
    >
>
split( const std::vector<T>& vector, size_t slices)
{ /* ... */ }

请参阅在哪里以及为什么必须放置“模板”和“类型名称”关键字?有关更多信息typename

于 2013-02-25T16:42:11.260 回答