转发声明一个STL容器?

时间:2008-11-20 23:58:32

标签: c++ stl header

是否可以在头文件中转发声明STL容器?例如,请使用以下代码:

#include <vector>

class Foo
{
private:
    std::vector<int> container_;
    ...
};

我希望能够做到这样的事情:

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

class Foo
{
private:
    std::vector<int> container_;
    ...
};

可以这样做吗?

3 个答案:

答案 0 :(得分:32)

vector命名空间中声明std未定义的行为。因此,您的代码可能会起作用,但也可能不起作用,编译器没有义务在您的尝试不起作用时告诉您。这是一场赌博,我不知道避免包含标准C ++标题是值得的。

请参阅以下comp.std.c ++。主持讨论:

forward declaring std::vector. Works, but is it legal and standard compliant?

答案 1 :(得分:17)

我不这么认为,因为编译器无法知道为container_对象分配多少空间。你最多可以这样做:

std::vector<int> *container_;

并在构造函数中新建它,因为编译器知道指针的大小。

答案 2 :(得分:9)

除了其他人所说的(亚当罗森菲尔德除外)之外,您可能会发现知道有一种前瞻性的方式来声明iostream和一些相关的模板:标题<iosfwd>(见{{3 }})。如果标准有更多这样的标题会很有用。