是否可以在头文件中转发声明标准容器?例如,使用以下代码:
#include <vector>
class Foo
{
private:
std::vector<int> container_;
...
};
我希望能够做这样的事情:
namespace std
{
template <typename T> class vector;
}
class Foo
{
private:
std::vector<int> container_;
...
};
可以这样做吗?
在vector
名称空间中声明std
为未定义行为。因此,您的代码可能会起作用,但也可能不会起作用,并且编译器没有义务告诉您何时您的尝试不起作用。那是一场赌博,我不知道避免包含标准的C ++标头值得。
请参见下面的comp.std.c ++。moderated讨论:
forward declaring std::vector. Works, but is it legal and standard compliant?
我不这样认为,因为编译器无法知道为container_
对象分配多少空间。充其量您可以做:
std::vector<int> *container_;
并且在构造函数中新增了它,因为编译器知道指针的大小。
除了其他人所说的,您可能会发现知道有一种批准的iostream和一些相关模板的认可方法很有用:标头<iosfwd>
。如果标准具有更多此类标头,将很有用。