C++ 正向声明标准容器?

C++ 正向声明标准容器?,c++,header,c++-standard-library,C++,Header,C++ Standard Library,是否可以在头文件中向前声明标准容器?例如,以以下代码为例: #include <vector> class Foo { private: std::vector<int> container_; ... }; #包括 福班 { 私人: std::向量容器; ... }; 我希望能够做到以下几点: namespace std { template <typename T> class vector; } class Foo { p

是否可以在头文件中向前声明标准容器?例如,以以下代码为例:

#include <vector>

class Foo
{
private:
    std::vector<int> container_;
    ...
};
#包括
福班
{
私人:
std::向量容器;
...
};
我希望能够做到以下几点:

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

class Foo
{
private:
    std::vector<int> container_;
    ...
};
名称空间std
{
模板类向量;
}
福班
{
私人:
std::向量容器;
...
};

这可以做到吗?

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

std::vector<int> *container_;
std::vector*容器;

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

std
名称空间中声明
向量
未定义的行为。因此,您的代码可能工作,但也可能不工作,并且编译器没有义务告诉您您的尝试何时无法工作。这是一个赌博,我不知道避免包含标准的C++头是值得的。

见下面的COMP.ST.C++。主持讨论:


除了其他人所说的,您可能会发现知道有一种被认可的方式来转发声明iostream和一些相关模板是很有用的:标题
。如果标准中有更多这样的标题,这将非常有用。

正是我想说的,但这是所有转发声明的问题,而不是指定给
命名空间std
中的声明。因此,它回答了真正的问题,而不是OP提出的问题我们不能简单地向前声明某个东西,然后用值实例化它,原因很明显。我跟随了你的链接到讨论中,但人们似乎没有得出结论。显然,stl实现不能向标准容器添加任何模板参数。因此,应该允许它向前声明模板。它是未定义的@Haplo。如果您使用的实现选择定义超出标准规定的行为,这很好,但它仍然没有定义,因此您的代码将无法移植。结论(从未被质疑的语句判断)是标准应该允许它,但不允许,并且有两种解决方法:将标准类型包装在前向声明的用户结构中,或者直接包含标准头。后者很容易做到。Usenet上的“不受质疑的声明”很难成为权威来源。但是,Jerry Coffin引用[namespace.std]/1是正确的。在实践中,如果编译器在非系统标题中诊断“代码>命名空间STD < /Calp>声明,或者如果标准库没有在C++中实现,那么您可能会遇到问题,但这些事情永远不会发生。