c++ - 迭代器类型中使用的 vector 元素类型

标签 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

最佳答案

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;
}

关于c++ - 迭代器类型中使用的 vector 元素类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46458125/

相关文章:

c++ - OpenCV 未填满整个图像

c++,一个遍历树状结构的通用递归模板函数

c - 有没有办法在单个翻译单元中理智地使用 GCC __attribute__((noreturn)) 和 <stdnoreturn.h> ?

Java:CaptureDeviceManager#getDeviceList() 为空?

c++ - 如何编写编译器可以优化到 SIMD 比较的代码?

C++,Ifstream 打开本地文件但不打开 HTTP 服务器上的文件

c++ - 使用不同优化级别编译的不同翻译单元中的模板实例化

c++ - 在条件表达式中使用时,gcc 或其他编译器是否自动将按位或转换为 bool 值或?

c++ - 插入结构的 vector 该 vector 的一个元素

c++ - 如何查明某个字符串是否包含在 std::vector 的任何字符串中?