在std命名空间中转发变量/类的声明

how*_*rks 11 c++ class std forward-declaration

如果我有一个不需要在.hpp文件中完整定义的类,我通常主要使用前向声明

例)

 //B.hpp

 namespace A_file {
   class A;
 }

 namespace B_file {

  class B {
   public:
        B();
   private:
        A *ptr_to_A;
  }
 }

 //B.cpp

 #include "A.hpp"
 using namespace A_file;

 namespace B_file {

   B(int value_) {
        *ptr_to_A = new A(value_);
   }

   int some_func() {
        ptr_to_A->some_func_in_A();
   }
 }
Run Code Online (Sandbox Code Playgroud)

我写这种代码.我想,它将再次包括整个hpp.(随意评论,如果你的事情,这是不健康的)

有没有办法可以对std命名空间中的对象/类做同样的事情?如果有办法,可以,还是有副作用?

Joh*_*nPS 22

您可以在头文件中转发声明自己的类以节省编译时间.但你不能在命名空间std中的类.根据C++ 11标准,17.6.4.2.1:

如果C++程序向命名空间std或命名空间std中的命名空间添加声明或定义,则它是未定义的,除非另有说明.

请注意,其中一些类是模板化类的typedef,因此简单的前向声明将不起作用.您可以使用#include<iosfwd>,而不是#include<iostream>例如,但也有只是前锋的声明没有类似的标题string,vector等等.

有关更多信息,请参阅GotW#34,前向声明.

  • +1.可以预见的是,`<iosfwd>`设置的先例也是最佳实践:更喜欢有一个额外的前向声明标题,包含在"普通"标题中以获得正在进行的有效性的编译时检查,以及仅需要前瞻性声明.它应该"生存"并使用代码为forward forward的库来维护,而不是客户端代码!GotW上面给出的确切原因推动了这一点:结构可能成为模板的typedef,模板可能会添加参数等. (2认同)