是否可以在头文件中转发声明STL容器?例如,请使用以下代码:
#include <vector>
class Foo
{
private:
std::vector<int> container_;
...
};
我希望能够做到这样的事情:
namespace std
{
template <typename T> class vector;
}
class Foo
{
private:
std::vector<int> container_;
...
};
可以这样做吗?
答案 0 :(得分:32)
在vector
命名空间中声明std
是未定义的行为。因此,您的代码可能会起作用,但也可能不起作用,编译器没有义务在您的尝试不起作用时告诉您。这是一场赌博,我不知道避免包含标准C ++标题是值得的。
请参阅以下comp.std.c ++。主持讨论:
forward declaring std::vector. Works, but is it legal and standard compliant?
答案 1 :(得分:17)
我不这么认为,因为编译器无法知道为container_
对象分配多少空间。你最多可以这样做:
std::vector<int> *container_;
并在构造函数中新建它,因为编译器知道指针的大小。
答案 2 :(得分:9)
除了其他人所说的(亚当罗森菲尔德除外)之外,您可能会发现知道有一种前瞻性的方式来声明iostream和一些相关的模板:标题<iosfwd>
(见{{3 }})。如果标准有更多这样的标题会很有用。