5

我有一个在任何类型的 STL 容器上运行的函数,需要将容器的元素类型传递给另一个模板函数。实际上,当我说任何容器类型时,我并不是真正的意思。严格来说只有向量和数组。我有这样的事情:

template <typename T> int ProcessData(T data)
{
  return DoInternalProcessing<T::value_type>(data.data(), data.size());
}

MSVC11 接受此代码,但 gcc 不接受。它出什么问题了?对于 gcc,我考虑过将值类型也作为参数,但这需要调用者指定 T (容器类型),这对于 std::array 来说非常笨拙,并且该函数的主要目的是提供一个非常简单的接口从基础数据中抽象出来。

4

1 回答 1

7

由于T::value_type是依赖类型,因此您需要typename T::value_type.

但是,这不适用于数组——数组不会value_type像 avector那样提供 typedef。

处理这个问题的常用方法是接受一对迭代器(或指针,如果底层“集合”是一个数组)。在这种情况下,您可以使用std::iterator_traits<T>::value_type来获取迭代器所引用的值类型。这将适用于原始指针,因此(例如)std::iterator_traits<int *>::value_type将 yield int

如果你真的必须使用容器(并支持数组),你可以使用std::begin(data)一个迭代器来获取数据的开头,然后使用std::iterator_traits<T>::value_type它来获取 value_type。

于 2013-05-26T05:35:52.807 回答