C++ 允许模板中存在不完整类型的技巧?
C++STL容器不允许使用不完整的类型进行实例化;这是未定义的行为 这是绕过这一限制的有效“伎俩”吗?或者这个技巧仍然有未定义的行为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,
#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中对此进行诊断,但这取决于概念,由于各种原因,这些概念没有被引入。