为什么这个类的声明不是Visual Studio的工作

问题描述:

所以我试图让这对GCC编写一些代码编译上的Visual Studio 2008年我有我已经缩小到这是一个问题:为什么这个类的声明不是Visual Studio的工作

class value_t 
{ 
public: 
    typedef std::deque<value_t>   sequence_t; 
    typedef sequence_t::iterator  iterator; 
}; 

此代码失败:

1>cpptest.cpp 
1>c:\program files\microsoft visual studio 9.0\vc\include\deque(518) : error C2027: use of undefined type 'value_t' 
1>  c:\temp\cpptest\cpptest.cpp(10) : see declaration of 'value_t' 
1>  c:\temp\cpptest\cpptest.cpp(13) : see reference to class template instantiation 'std::deque<_Ty>' being compiled 
1>  with 
1>  [ 
1>   _Ty=value_t 
1>  ] 
1>c:\program files\microsoft visual studio 9.0\vc\include\deque(518) : error C2027: use of undefined type 'value_t' 
1>  c:\temp\cpptest\cpptest.cpp(10) : see declaration of 'value_t' 

然而,当我尝试用这个的std ::向量,它编译罚款:

class value_t 
{ 
public: 
    typedef std::vector<value_t>  sequence_t; 
    typedef sequence_t::iterator  iterator; 
}; 

瓦在错误?我曾尝试在我能想到的任何地方添加'typename',但此时我认为这只是Dinkumware STL中的一个错误。任何人都可以解释发生了什么,和/或提供解决方案?谢谢。

+1

“你能想到的地方”是否包含'typedef typename sequence_t :: iterator iterator;'? – Stephen 2010-06-10 18:46:23

+0

您可以在类声明前尝试前向声明。即class_value_t; – 2010-06-10 18:46:36

+0

好吧,这总是发生 - 我发布这个问题后,我发现在谷歌魔术组合给我一些相关的东西。参见http://www.gamedev.net/community/forums/topic.asp?topic_id=295828其中讨论了这个主题;仍然不提供解决方案。有人可以证实,在这种情况下使用deque是非标准的吗?有没有办法让这个工作不需要更改文件? – Roel 2010-06-10 18:46:48

它的未定义的行为。查看CLC++ this链接主持

丹尼尔·K公司的回答剪断: - 。

C++标准(包括C++ 03和 的C++ 0x)说,你正在尝试 原因未定义行为,参见 [lib.res.on.functions]/2:

“特别地,所述效果是 未定义在下列情况下: [..] - 如果一个不完整的类型(3.9)是 用过作为模板参数时 实例化模板组件。“

+0

谢谢,那个线程解释了我最想要的细节。猜猜我必须更改代码。 – Roel 2010-06-10 19:00:51

您正试图在模板中使用自己的类。它如何解决这个问题?我不知道我曾尝试过这样做,但这甚至有可能吗?我不知道它为什么适用于std :: vector,但我的假设是它是错误的。您正在定义一个类,并在定义中使用该定义。似乎对我错了。在这一个祝你好运,我会很有兴趣看到一些更深层次的答案自己...

+0

它适用于std :: vector,并且在gcc上这个代码也编译得很好。我想只要sizeof(class)已知就足够了。它显然也绊住了我在评论中发布的链接中的人们。我一直在用矢量做这个多年 - 只是一个巧合,它的工作,然后,我猜。 – Roel 2010-06-10 18:57:11

认为问题是value_t是一个不完整的类型,直到达到定义的结束。试图将不完整的类型用作标准容器的模板参数实际上并不适用。它在某些情况下可能会发生作用,但如果它在所有标准容器类型中都失败了,仍然不会发出任何类型的错误。该标准要求它是一个完整的类型,所以如果不是,你会得到你所得到的 - 它可能应该一致失败,但如果它碰巧工作,那没有什么错。