C++ 正向声明指向STL容器的指针?

C++ 正向声明指向STL容器的指针?,c++,pointers,stl,forward-declaration,C++,Pointers,Stl,Forward Declaration,在我的头文件中,我希望避免使用#include,但我的类将有一个向量或指向向量的指针。我只满足于一个指针,但我不知道如何声明它。我是否必须宣布它为无效*并始终使用它?那太差劲了 // What do I type here to forward declare vector? class Counters { Counters(); void inc(const char* s); void print(); void clear(); private:

在我的头文件中,我希望避免使用#include,但我的类将有一个向量或指向向量的指针。我只满足于一个指针,但我不知道如何声明它。我是否必须宣布它为无效*并始终使用它?那太差劲了

// What do I type here to forward declare vector?

class Counters
{
    Counters();

    void inc(const char* s);

    void print();

    void clear();

private:
    std::vector<int>* Counts;
    int total;
};
//我应该在这里键入什么来转发声明向量?
班级计数器
{
计数器();
void公司(const char*s);
作废打印();
无效清除();
私人:
std::向量*计数;
整数合计;
};

请注意,我只希望在类中存储指向容器的指针,而不是容器。指针的大小是已知的,无需参考容器的声明,因此请不要回答这无法完成,因为编译器需要知道容器声明。

可能在您的情况下可以这样做:

//header
struct Container;

struct Foo{
    Container *container;
};

//cpp
#include <vector>

struct Container : std::vector<int>{

};

int main(){
    Foo foo;
    foo.container = new Container;
    foo.container->push_back(42);
}
//头
结构容器;
结构Foo{
集装箱*集装箱;
};
//cpp
#包括
结构容器:std::vector{
};
int main(){
富富,;
foo.container=新容器;
食物容器->推回(42);
}

“在我的头文件中,我想避免使用#include”这就是问题所在,只需包含您需要的内容。为什么要避免使用#include?这样做应该没有什么害处。转发声明的存在是有原因的,伙计们。关于修剪的研究有很多文献,包括减少重新编译、改进编译时间、提高可移植性、打破循环依赖性等。在这种情况下,这个声明将被CUDA编译器和主C++编译器所消耗,并且非常值得避免在CUDA将解析的代码中包含太多的CRAP。相信我,布莱恩,这不是复制品。在发布之前,我仔细研究了“向前声明STL容器”这个问题。前向声明指针和数据结构之间存在巨大差异。我的案例对编译器来说很容易;我只需要弄清楚forward声明的语法。@我所知道的所有这些问题都不同,但答案是一样的。不能转发declare
std::vector
或其他标准库容器,因为在大多数情况下,将自己的声明添加到
命名空间std
是未定义的行为。不要从标准容器继承。否则,pimpl成语就没问题了。