使用类作为具有前向声明的STL类的模板参数

时间:2014-01-08 22:14:09

标签: c++ templates stl

继续问我的问题here

我知道在正向减速之后,例如

class Foo;

我可以将变量声明为Foo*Foo&,但不能Foo,如果我的模板类Bar<T>只有T*T&在其内部,同样的规则适用于Bar<Foo>(即我只需要向前减速才能写Bar<Foo>)。

我的问题是STL类是否保证这样,它们只包含对模板类型的引用和指针。我测试了这个:

class A;
std::vector<A> b;

使用ST20的VS2010实现并编译,但我不知道这是否适用于所有STL容器,也不知道这是否是STL的MS实现的方式,或者它是否是标准。

2 个答案:

答案 0 :(得分:3)

C ++标准要求所有类模板的完整类型(例如std::shared_ptrstd::unique_ptr在某些特殊情况下)。容器需要完整的类型,因此您的代码示例将技术上产生未定义的行为,即使它可能适用于某些实现。

请注意boost.container有std c ++ - 类似于containers for incomplete types

请参阅此related SO post

这是在 17.6.4.8 [res.on.functions] 中列出的,它指定了未定义的行为

  

如果在实例化模板组件时将不完整类型(3.9)用作模板参数,除非特别允许该组件。

感谢@DietmarKühl找到合适的报价。

答案 1 :(得分:2)

在17.6.4.8 [res.on.functions]第2段中陈述

  

特别是,在以下情况下效果未定义:

     
      
  • [...]
  •   
  • 如果在实例化模板组件时将不完整类型(3.9)用作模板参数,除非特别允许该组件。
  •   

也就是说,标准库容器需要进行显式豁免,允许对具有不完整类型的某些类型进行实例化。我很漂亮,容器部分没有说明这样的例外情况。