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

C++ 迭代器类型中使用的向量元素的类型,c++,gcc,vector,struct,types,C++,Gcc,Vector,Struct,Types,如果我有一个结构: 我尝试使用以下方法获取列表的迭代器类型: typedef typename std::vector<decltype(x.list[0])>::iterator IT; 我怀疑GCC中C++的底层实现有什么错误,这个错误似乎表明。 使用此方法还假设列表不是空的,所以我尝试使用::value_type,正如其他so答案中建议的那样: typedef typename std::vector<x.list::value_type>::iterator I

如果我有一个结构:

我尝试使用以下方法获取列表的迭代器类型:

typedef typename std::vector<decltype(x.list[0])>::iterator IT;
我怀疑GCC中C++的底层实现有什么错误,这个错误似乎表明。 使用此方法还假设列表不是空的,所以我尝试使用::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\u type?

decltypex.list[0]的类型是long double&。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;
}

在您的情况下:使用它=decltypex.list.begin;。让它成为引用类型而不是普通的长双精度码的原因是什么?
template<typename T>
struct s {
    T typeholder;
    std::vector<T> list;
};
typedef typename std::vector<decltype(x.typeholder)>::iterator IT;
#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;
}