Forward Declaration of variables/classes in std namespace

I usually use forward declaration predominantly, if I have a class that does not need complete definition in .hpp file

Ex)

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

I write this kind of code. I think, it will save including the whole hpp again. (Feel free to comment, if you thing, this is not healthy)

Is there a way that I can do the same for objects/classes in std namespace? If there is a way, is it okay or does it have side effects?


You can forward declare your own classes in header files to save compilation time. But you can't for classes in namespace std. According to the C++11 standard, 17.6.4.2.1:

The behavior of a C++ program is undefined if it adds declarations or definitions to namespace std or to a namespace within namespace std unless otherwise specified.

Note that some of these classes are typedefs of templated classes, so a simple forward declaration will not work. You can use #include<iosfwd> instead of #include<iostream> for example, but there are no similar headers with just forward declarations for string, vector, etc.

See GotW #34, Forward Declarations for more information.