欺骗允许模板中的不完整类型?

时间:2013-09-26 16:44:17

标签: 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;
}

1 个答案:

答案 0 :(得分:4)

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