代码之家  ›  专栏  ›  技术社区  ›  fredoverflow

STL容器的转发头

  •  8
  • fredoverflow  · 技术社区  · 14 年前

    标题 <iostream> 有一个同伴 <iosfwd> 如果我只需要指向流的指针或引用,这就足够了。后者是重载时的常见情况 operator<< .

    STL容器有这样的标题吗?我想定义几个引用STL容器的函数,我不想包括 <vector> , <list> , <set> 等。它们的整体,这样我就可以引用这些类型。这个问题是否有标准的、增强的或其他的解决方案?

    4 回复  |  直到 14 年前
        1
  •  1
  •   wilhelmtell    14 年前

    不,不幸的是不是。标准只介绍 <iosfwd> 为了向后兼容以支持为旧的非模板化IO流库编写的代码。

        2
  •  4
  •   sbi    14 年前

    STL容器有这样的标题吗?

    不,没有。

    这个问题是否有标准的、增强的或其他的解决方案?

    我不知道。

    您必须包含这些标题。

        3
  •  0
  •   Kos    14 年前

    实际上,为什么不可能有一个模板类转发声明呢?

    如果你非常需要一个解决办法,你可以这样做:

    namespace std {
    
        template<typename T>
        class allocator;
    
        template<typename T, typename Alloc>
        class vector;
    }
    

    添加一个include-guard,另存为“stdfwd.h”或其他什么,然后开始。

    这样的东西不包括 <vector> :

    void print(std::vector<int, std::allocator<int> >& v);
    

    在GCC4.5为我工作。目前我不知道如何透明地解决声明和定义中不能同时有默认参数(也是模板参数)的问题,这是什么。但这是可能的-也许有人可以从这里接管?:)我不想在生产代码中使用它,但它看起来像一个有趣的练习。

        4
  •  -1
  •   cababunga    14 年前

    使用iosfwd可以做到这一点,因为只有两种类型的模板需要实例化:char和wchar_u t。所以最后得到的是实例化的具体类型的正向声明。另一方面,STL容器被假定与任何类型一起工作,所以STL头中没有明确的内容。