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

时间:2012-04-23 23:34:37

标签: 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();
   }
 }

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

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

1 个答案:

答案 0 :(得分:22)

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

  

如果添加声明或者C ++程序的行为是未定义的   命名空间std或命名空间std中的命名空间的定义   除非另有说明。

请注意,其中一些类是模板化类的typedef,因此简单的前向声明将不起作用。例如,您可以使用#include<iosfwd>代替#include<iostream>,但没有类似的标头只包含stringvector等的前向声明。

有关详细信息,请参阅GotW #34, Forward Declarations