Вперед Объявление переменных/классов в пространстве имен 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.