我有一个在任何类型的STL容器上运行的函数,需要将容器的元素类型传递给另一个模板函数。实际上,当我说任何容器类型时,我并不是真的意思。严格只有矢量和数组。我有这样的事情:
template <typename T> int ProcessData(T data)
{
return DoInternalProcessing<T::value_type>(data.data(), data.size());
}
MSVC11接受此代码但gcc不接受此代码。它出什么问题了?对于gcc,我还想过将值类型作为参数但是那时需要调用者指定T(容器类型),这对于std :: array来说非常笨重,而这个函数的主要目的是提供一个非常简单的接口它抽象出基础数据。
答案 0 :(得分:7)
由于T::value_type
是从属类型,因此您需要typename T::value_type
。
这不适用于数组 - 数组不会像value_type
一样提供vector
的typedef。
处理这个的常用方法是接受一对迭代器(或指针,如果底层的“集合”是一个数组)。在这种情况下,您可以使用std::iterator_traits<T>::value_type
来获取迭代器引用的值类型。这将与原始指针一起使用,因此(例如)std::iterator_traits<int *>::value_type
将产生int
。
如果你真的必须使用容器(和支持数组),你可以使用std::begin(data)
来获取数据开头的迭代器,然后使用std::iterator_traits<T>::value_type
来获取value_type。