类作为模板参数的前向声明

forward declaration of classes as template arguments

本文关键字:声明 参数      更新时间:2023-10-16

我一直知道,在C++中,只能使用带有引用或指针的前向声明类。为什么我使用下面的正向声明类作为std::vector的模板参数,在编译过程中不会有任何问题?

感谢

AFG-

 // MyFile.hpp
 class OutClass{
 public:
      class InnClass;
      OutClass();
      void print();
      // why this doesn't create compile time
      std::vector< InnClass > m_data;
 };

 // MyFile.cpp
 class OutClass::InnClass{
 public:
      InnClass() : m_ciao(0) {}
      int m_data;
 };

 OutClass::OutClass()
 : m_data(){
        InnClass a, b;
       a.m_ciao=1; b.m_ciao=2;
        m_data.push_back( a );
        m_data.push_back( b );
 }
 void OutClass::print(){
      std::cout << m_data[0].m_ciao << std::endl;
      std::cout << m_data[1].m_ciao << std::endl;
 }

 int main( int argc, char** argv ){
      OutClass outObj;
      outObj.print();
      return 0;
 }

因为std::vector在您的平台上的具体实现可能不需要T完整类型。对于vector来说,这相对容易做到,因为它基本上只由指针组成,因此如果操作得当,不需要完整的类型。然而,对于std::vector,标准要求T完全类型。所以,不要依赖它。