向前声明一个STL容器?

是否有可能在头文件中转发声明一个STL容器? 例如,采取以下代码:

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

我想能够做到这样的事情:

 namespace std { template <typename T> class vector; } class Foo { private: std::vector<int> container_; ... }; 

可以这样做吗?

std命名空间中声明vector未定义的行为 。 所以,你的代码可能工作,但也可能不行,编译器没有义务告诉你什么时候你的尝试不能工作。 这是一场赌博,我不知道避免包含标准的C ++头文件是值得的。

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

向前声明std :: vector。 工程,但它是合法的和标准兼容?

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

 std::vector<int> *container_; 

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

除了别人所说的(除了Adam Rosenfield)之外,你可能会发现有一种被认可的方式来向前声明iostreams和一些相关的模板:头文件<iosfwd> (参见http://msdn.microsoft.com&#x3002; com / en-us / library / 1af12yty%28VS.80%29.aspx )。 如果标准具有更多这样的标题,这将是有用的。