2010-11-15 2 views
1

В настоящее время пытается создать систему XML с использованием Ogre и STL. В качестве доказательства концепции мы пытаемся заставить ее выводить содержимое файла XML в наш файл журнала. К сожалению, наш текущий код не будет компилироваться, и мы не знаем почему. Соответствующий код следует:Пользовательский поток/streambuf с использованием Ogre3d с неоднозначными ошибками перегрузки

Вот класс потока, который мы унаследовали, чтобы упростить управление настраиваемым streambuf. Основная причина, по которой он существует, удалить пользовательский streambuf в деструкторе.

class ResourceInputStream : public std::istream 
{ 
    private: 
     internal::OgreDataStreamBuf* OgreBuffer; 
     ResourceManager* Manager; 

     /// @internal 
     /// @brief Called by the constructors to actually construct this class 
     /// @param InputBuffer A pointer to an internal::OgreDataStreamBuf. A buffer to read from the disk access subsystem (which happens to be part of Ogre). This Stream will assume ownership of this buffer and will handle deleting it. 
     /// @param ResourceManager_ Currently unused, future functionality may tuse this. 
     void Construct(std::streambuf *InputBuffer, ResourceManager* ResourceManager_); 

    protected: 

    public: 
     /// @brief Descriptive Constructor 
     /// @param InputBuffer A pointer to an internal::OgreDataStreamBuf. A buffer to read from the disk access subsystem (which happens to be part of Ogre). This Stream will assume ownership of this buffer and will handle deleting it. 
     /// @param ResourceManager_ Currently unused, future functionality may tuse this. 
     /// @warning Do not delete the InputBuffer you pass in, this class will assume owner ship and delete it on it's own 
     ResourceInputStream(std::streambuf *InputBuffer, ResourceManager* ResourceManager_) : 
      std::istream(InputBuffer) 
      { this->Construct(InputBuffer, ResourceManager_); } 

     /// @brief Tears down the Stream, and Delete the Buffer Passed in. 
     virtual ~ResourceInputStream(); 

}; 

Вот определение для пользовательского класса streambuf. Он использует ogreDatastreambuf для чтения из сжатых файлов в которые управляются с помощью библиотеки ресурсов Ogre:

class OgreDataStreamBuf : public std::streambuf 
     { 
      protected: 
       /// @brief a shard_ptr to the internal Ogre Datastream 
       Ogre::DataStreamPtr OgreStream; 

      public: 

       /// @brief constructor 
       /// @param Datum A pointer to the Ogre Datastream that this stream will use 
       OgreDataStreamBuf(const Ogre::DataStreamPtr& Datum) : OgreStream(Datum) 
       { 
        #ifdef PHYSDEBUG 
        World::GetWorldPointer()->Log("Entering/Exiting OgreDataStreamBuf Constructor"); 
        #endif 
       } 

       /// @brief Should get the amount of characters left in the sequence 
       /// @returns -1 if no estimate could be made, other wise this returns an estimate of the amount of bytes in the buffer 
       std::streamsize showmanyc(); 

       /// @brief Gets a sequence of characters 
       /// @param s a Pointer to where the characters should go 
       /// @param n How many characters 
       /// @return This returns the amount of characters retrieved 
       std::streamsize xsgetn(char* s, std::streamsize n); 

       /// @brief puts a sequence of characters in 
       /// @param s a Pointer to the characters 
       /// @param n How many characters 
       /// @return This returns the amount of characters inserted 
       /// @detail currently unimplimented 
       std::streamsize xsputn(const char_type*, std::streamsize n); 
     }; 
    } 

Вот фрагмент кода, пытающегося использовать этот класс потока. TheWorld-> LogStream - это std :: stringstream.

ResourceInputStream* XMLptr = TheWorld->GetResourceManager()->GetResourceStream("test.xml"); 
std::stringstream XMLStringStream; 
(*XMLptr) >> XMLStringStream; 
String ShouldHaveXML(XMLStringStream.str()); 
TheWorld->LogStream << "ShouldHaveXML: " << ShouldHaveXML << endl << "End XML Logging" <<endl; 
TheWorld->Log("Delete XML Stream"); 
delete XMLptr; 

Попытка компиляции вызывает эту ошибку:

error: ambiguous overload for 'operator>>' in '* XMLptr >> XMLStringStream' 

Я исследовал эту ошибку, и единственное, что я могу найти об этом ... это связано с чем-то быть объявлен сопзЬ, что не должен» т. Насколько это возможно, это не относится к нашему коду. Поэтому я не понимаю, почему это происходит, или как это исправить. Любые идеи были бы весьма полезны.

ответ

0

Похоже, что здесь имеется много лишней ненужной информации. Суть проблемы заключается в том, что нет оператора потоковой передачи, который можно получить из istream >> в ostream.

Все Огре и пользовательский класс вещь просто не требуются, в то же время нам удалось получить наши данные из класса, используя s простой обходной путь:

ResourceInputStream* XMLptr = TheWorld->GetResourceManager()->GetResourceStream("test.xml"); 
char chararray[401]; 
chararray[400]='\0'; 
XMLptr->read(chararray, 400); 
String ShouldHaveXML(chararray); 

Это просто тестовый код, я бы всегда предлагайте использовать istream :: gcount, прежде чем считать, что вы прочитали количество запрошенных вами данных.

 Смежные вопросы

  • Нет связанных вопросов^_^