прямое объявление классов в качестве аргументов шаблона - PullRequest
3 голосов
/ 21 июня 2011

Я всегда знал, что в 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;
 }

1 Ответ

4 голосов
/ 21 июня 2011

Потому что, возможно, для конкретной реализации std::vector на вашей платформе не требуется T, чтобы быть завершенным типом . Это относительно легко сделать для vector, так как в основном он состоит только из указателей и, как таковой, не требует полного типа, если все сделано правильно. Однако на самом деле стандарт требует, чтобы T был завершенным типом для std::vector. Так что не надейся на это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...