向前声明一个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。; com / en-us / library / 1af12yty%28VS.80%29.aspx )。 如果标准具有更多这样的标题,这将是有用的。