C++ 允许模板中存在不完整类型的技巧?

C++ 允许模板中存在不完整类型的技巧?,c++,stl,incomplete-type,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,

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;
}
#包括
模板
构造我的不完整向量
{
结构元素;
//元素在这里是不完整的,但它还重要吗?
类型定义向量类型;
结构元素{typename type::iterator value;};
};
int main()
{
my_不完全_向量::类型v;
v、 调整大小(1);
//如果没有不完整的类型,这通常是不可能的
v[0]。值=v.begin();
返回0;
}

这是未定义的行为。该标准要求输入一个类型 如果它用作模板的参数,请在 模板实例化的点。及
my\u complete\u vector::Element
在使用时不完整 内部
元素
。在你真正做到这一点之前,不会出现任何问题 当然,实例化您的模板,但是g++无法编译 您的代码具有常见的调试选项 (
-D_GLIBCXX_概念检查-D_GLIBCXX_调试

-D_GLIBCXX_DEBUG_PEDANTIC
)。

您不会“在容器中存储类型”。你把东西放在容器里。@KerrekSB:我修正了它,但你的观点是什么?这个问题本来就很空洞。。。为什么天空是由砖块等构成的?我在这里没有看到任何不完整的类型。@JohnSmith
元素
在用于定义
类型
时是不完整的。这不是类似于
结构t{t*p;}
T
不完整,但可以定义指针/迭代器吗?@JohnSmith类型不一定要完整才能声明指向它的指针。@JamesKanze:我不明白这里到底有什么未定义的。在
向量
的实例化点上,
元素
已经定义,不是吗?当
向量
实例化为不完整的
元素
类型时?@Mehrdad否。
向量
的实例化点在类
元素
内,因此
元素
仍然是不完整的类型。@Dilip这可能是未定义行为的结果之一。委员会希望在C++11中对此进行诊断,但这取决于概念,由于各种原因,这些概念没有被引入。