迭代器类型中使用的向量元素的类型

时间:2017-09-27 22:22:35

标签: c++ gcc vector struct types

如果我有结构s

template<typename T>
struct s {
    std::vector<T> list;
};

main()中定义为:

s<long double> x;

我尝试使用以下方式获取list迭代器的类型:

typedef typename std::vector<decltype(x.list[0])>::iterator IT;

GCC 7.2.1产生了一系列错误,从:

开始
/usr/include/c++/7/bits/alloc_traits.h:392:27: error: forming pointer to reference type 'long double&'
    using pointer = _Tp*;
                        ^

我怀疑GCC中C ++的底层实现有什么问题,这个错误似乎表明了这一点。

使用此方法还假设list不为空,因此我尝试使用::value_type(如其他SO答案所示):

typedef typename std::vector<x.list::value_type>::iterator IT;

GCC再次产生错误:

error: the value of 'x' is not usable in a constant expression.
    typedef typename std::vector<x.list::value_type>::iterator IT;
                                   ^~~~

为了找到替代方案,我在结构中添加了一个类型保持变量:

template<typename T>
struct s {
    T typeholder;
    std::vector<T> list;
};

这很好用,使用:

typedef typename std::vector<decltype(x.typeholder)>::iterator IT;

我在哪里错了?为了保持类型,需要定义一个未使用的变量似乎很复杂。我误用了::value_type吗?

1 个答案:

答案 0 :(得分:1)

decltype(x.list[0])的类型为long double&std::vector无法存储引用,因此您会收到错误消息。第二个错误(“错误:'x'的值在常量表达式中不可用。”)似乎也很明显:你需要一个类型而不是一个值。这应该编译没有错误:

#include <vector>

template<typename T>
struct s {
    std::vector<T> list;
};

int main()
{
    s<long double> x;
    typedef typename std::vector<decltype(x.list)::value_type>::iterator IT;
}