Пользовательский поток / streambuf с использованием Ogre3d с неоднозначными ошибками перегрузки - PullRequest
1 голос
/ 15 ноября 2010

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

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

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 :: string.

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'

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

1 Ответ

0 голосов
/ 17 ноября 2010

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

Все Ogre и пользовательские классы просто не требовались, тем временем нам удалось вывести наши данные из класса с помощью простого обходного пути:

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

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

...