返回类型的模板参数减少

时间:2013-02-25 16:37:12

标签: c++ templates std

我有这个功能:

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 - 我还没有很好地理解模板减少的东西。

任何解释都赞赏。

3 个答案:

答案 0 :(得分: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关键字的使用,这在指定限定的依赖类型名称时是必需的。

答案 1 :(得分:1)

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

    ...

 }

您缺少typename,您可以替换容器的类型。

答案 2 :(得分: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

的详情,请参阅Where and why do I have to put the "template" and "typename" keywords?