8

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

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

4

4 回答 4

4

STL 容器有这样的标题吗?

不,没有。

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

从来没听说过。

您将必须包含这些标题。

于 2010-11-17T18:58:27.637 回答
1

不,很遗憾没有。该标准只是<iosfwd>为了向后兼容而引入,以支持为旧的、非模板化的 IO 流库编写的代码。

于 2010-11-17T19:00:41.300 回答
0

实际上,为什么不能有一个模板类前向声明​​?

如果您迫切需要解决方法,则可以使用以下方法:

namespace std {

    template<typename T>
    class allocator;

    template<typename T, typename Alloc>
    class vector;
}

添加一个包含保护,另存为“stdfwd.h”或其他内容,然后就可以了。

然后这样的事情不包括<vector>

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

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

于 2010-11-17T19:35:49.427 回答
-1

使用 iosfwd 可以做到这一点,因为只有两种类型的模板必须实例化:char 和 wchar_t。所以你最终得到的是实例化具体类型的前向声明。另一方面,假设 STL 容器可以与任何类型一起使用,因此 STL 标头中没有任何明确的内容。

于 2010-11-17T19:37:22.030 回答