是否要转发标准容器?

问题描述 投票:47回答:3

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

#include <vector>

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

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

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

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

可以这样做吗?

c++ header c++-standard-library
3个回答
33
投票

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

请参见下面的comp.std.c ++。moderated讨论:

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


17
投票

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

std::vector<int> *container_;

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


10
投票

除了其他人所说的,您可能会发现知道有一种批准的iostream和一些相关模板的认可方法很有用:标头<iosfwd>。如果标准具有更多此类标头,将很有用。

© www.soinside.com 2019 - 2024. All rights reserved.