【问题标题】:Forward declare a pointer to an STL container?转发声明一个指向 STL 容器的指针?
【发布时间】:2016-05-27 22:49:05
【问题描述】:

在我的头文件中,我想避免使用#include,但我的类将有一个向量或指向向量的指针。我只满足于一个指针,但我不知道如何声明它。我是否必须将其声明为 void* 并始终投射它?那会很蹩脚。

// 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;
};

请注意,我只想将指向容器的指针存储在我的类中,而不是容器中。指针的大小是已知的,不需要参考容器的声明,所以请不要回答说不能这样做,因为编译器需要知道容器的声明。

【问题讨论】:

  • “在我的头文件中我想避免使用#include” 问题就在这里,只包含你需要的。
  • 为什么要避开#include &lt;vector&gt;?这样做应该没有任何害处。
  • 前向声明的存在是有原因的,伙计们。有大量关于修剪 #includes 以减少重新编译、改进编译时间、提高可移植性、打破循环依赖等的文献。在我的情况下,这个声明将被 CUDA 编译器以及主 C++ 编译器使用,非常值得尝试以避免在 CUDA 将解析的代码中包含太多废话。相信我。
  • @Brian,这不是重复的。我研究了“转发声明一个 STL 容器?”这个问题。在我发布之前彻底。前向声明指针和数据结构之间存在巨大差异。我的情况对编译器来说很容易;我只需要弄清楚前向声明的语法。
  • @AlltheRage 我知道问题不同,但答案是一样的。您不能转发声明 std::vector 或其他标准库容器,因为在大多数情况下,将您自己的声明添加到 namespace std 是未定义的行为。

标签: c++ pointers stl forward-declaration


【解决方案1】:

也许这适用于您的情况:

//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);
}

【讨论】:

猜你喜欢
  • 2011-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多