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