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

时间:2010-06-10 18:41:32

标签: c++ templates

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

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 :: vector尝试这个时,它编译得很好:

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

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

3 个答案:

答案 0 :(得分:7)

其未定义的行为。请参阅c.l.c ++。moderated

上的this链接

来自Daniel K的回答: -

  

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

     

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

答案 1 :(得分:5)

认为问题是value_t是一个不完整的类型,直到你到达定义的末尾。尝试使用不完整类型作为标准容器的模板参数实际上不应该起作用。它可能/将会在某些情况下工作,但如果它失败了所有标准容器类型,那仍然不会发出任何类型的错误信号。标准要求它是一个完整的类型,所以如果不是,你会得到你得到的东西 - 它可能应该一致地失败,但是如果它恰好起作用,那就没有错。

答案 2 :(得分:1)

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