Вперед Объявление переменных/классов в пространстве имен std

Обычно я использую форвардную декларацию преимущественно, если у меня есть класс, который не нуждается в полном определении в файле .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? Если есть способ, это нормально или у него есть побочные эффекты?

Ответ 1

Вы можете перенаправлять свои собственные классы в файлах заголовков, чтобы сохранить время компиляции. Но вы не можете использовать классы в пространстве имен std. Согласно стандарту С++ 11, 17.6.4.2.1:

Поведение программы на С++ undefined, если оно добавляет объявления или определения в пространство имен std или в пространство имен в пространстве имен std если не указано иное.

Обратите внимание, что некоторые из этих классов являются typedefs шаблонных классов, поэтому простое прямое объявление не будет работать. Например, вы можете использовать #include<iosfwd> вместо #include<iostream>, но нет похожих заголовков с только простыми объявлениями для string, vector и т.д.

Подробнее см. GotW # 34, Forward Declarations.