为什么此类声明不适用于Visual Studio

Roe*_*oel 6 c++ templates

所以我试图获得一些为gcc编写的代码,以便在Visual Studio 2008上编译.我有一个问题,我已经缩小到这个:

class value_t
{
public:
  typedef std::deque<value_t>         sequence_t;
  typedef sequence_t::iterator        iterator;
};
Run Code Online (Sandbox Code Playgroud)

此代码失败:

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'
Run Code Online (Sandbox Code Playgroud)

但是当我用std :: vector尝试这个时,编译很好:

class value_t
{
public:
  typedef std::vector<value_t>        sequence_t;
  typedef sequence_t::iterator        iterator;
};
Run Code Online (Sandbox Code Playgroud)

怎么了?我试过在我能想到的任何地方添加'typename',但此时此刻我认为它只是Dinkumware STL中的一个错误.谁能解释发生了什么,和/或提供解决方案?谢谢.

Abh*_*hay 7

它未定义的行为.请参阅clc ++.moderated上的链接

来自Daniel K的回答: -

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

"特别是,在以下情况下效果未定义:[..] - 如果在实例化模板组件时将不完整类型(3.9)用作模板参数."


Jer*_*fin 5

认为问题是这value_t是一个不完整的类型,直到你到达定义的结尾.尝试使用不完整类型作为标准容器的模板参数实际上不应该起作用.它可能/将会在某些情况下工作,但如果它失败了所有标准容器类型,那仍然不会发出任何类型的错误信号.该标准要求它是一个完整的类型,因此,如果不是的话,你会得到你所得到的-它或许应该始终失败,但如果它发生的工作,没有什么不妥.