转发声明一个STL容器?

Rob*_*Rob 47 c++ header c++-standard-library

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

#include <vector>

class Foo
{
private:
    std::vector<int> container_;
    ...
};
Run Code Online (Sandbox Code Playgroud)

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

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

class Foo
{
private:
    std::vector<int> container_;
    ...
};
Run Code Online (Sandbox Code Playgroud)

可以这样做吗?

Rob*_*edy 34

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

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

向前声明std :: vector.工作,但它是否符合法律和标准?


Eva*_*ran 17

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

std::vector<int> *container_;
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,但这是所有前向声明的问题,而不是`namespace std`中的那些.所以它回答了_real_问题,而不是OP问的问题.:P我们根本无法前向声明某些东西然后按值实例化它,原因很明显. (4认同)

Seb*_*ach 10

除了其他人所说的(亚当罗森菲尔德除外)之外,你可能会发现知道有一种前瞻性的方式来声明iostream和一些相关的模板是有用的:标题<iosfwd>(见http://msdn.microsoft.com/en -us/library/1af12yty%28VS.80%29.aspx).如果标准有更多这样的标题将是有用的.