Обычно я использую форвардную декларацию преимущественно, если у меня есть класс, который не нуждается в полном определении в файле .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();
   }
 }
Я пишу такой код. Я думаю, он сэкономит, включая весь hpp. (Не стесняйтесь комментировать, если вы это делаете, это не здорово)
Есть ли способ, которым я могу сделать то же самое для объектов/классов в пространстве имен std? Если есть способ, это нормально или у него есть побочные эффекты?