50

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

#include <vector>

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

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

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

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

这可以做到吗?

4

3 回答 3

36

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

请参阅以下 comp.std.c++.moderated 讨论:

向前声明 std::vector。有效,但它是否符合法律和标准?

于 2008-11-21T00:30:37.357 回答
18

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

std::vector<int> *container_;

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

于 2008-11-21T00:00:07.247 回答
12

除了其他人所说的之外,您可能会发现知道有一种被认可的方式来前向声明 iostream 和一些相关模板是很有用的: header <iosfwd>。如果标准有更多这样的标题,那将会很有用。

于 2010-10-13T10:16:21.067 回答