c++ - 允许模板中不完整类型的技巧?

标签 c++ stl incomplete-type

C++ STL 容器不允许实例化不完整的类型;这是未定义的行为。

这是绕过该限制的有效“技巧”吗?还是这个技巧仍然有未定义的行为?

#include <vector>

template<template<class, class> class Vector = std::vector>
struct my_incomplete_vector
{
    struct Element;

    // Element is incomplete here, but does it matter anymore?
    typedef Vector<Element, std::allocator<Element> > type;

    struct Element { typename type::iterator value; };
};

int main()
{
    my_incomplete_vector<>::type v;
    v.resize(1);

    // this isn't normally possible without incomplete types
    v[0].value = v.begin();
    return 0;
}

最佳答案

这是未定义的行为。该标准要求一个类型是 如果它被用作模板的参数,则完成 实例化模板的点。和 my_incomplete_vector::Element 使用时不完整 在 Element 中。没有问题不会发生,直到你真正 当然,实例化您的模板,但是 g++ 无法编译 您的代码与通常的调试选项 (-D_GLIBCXX_CONCEPT_CHECKS -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC).

关于c++ - 允许模板中不完整类型的技巧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19033970/

相关文章:

c++ - GCC 无法正确解析 std::accumulate

c++ - 如何从 QGraphicsScene 中删除所有 QGraphicsItem

c++ - 不完整类型/前向声明的无效使用

c++ - 用于列出子目录中所有文件的递归函数

c++ - const_cast const STL 容器,它是未定义的行为吗?

c++ - 使用列表的此 C++ 代码出现段错误的原因是什么?

c99 取消引用指向不完整类型的指针

c++ - 在 Matlab 中进行类型转换

C++ cout 在两个大十进制数(long double)之间的运算后打印 "inf "

c++ - 处理线性上采样音频阵列