LINUX.ORG.RU

Поиогите разобраться с вложенными namespace'ами


0

0

Есть код:

//id3v1stringhandler.h

namespace TagLib
{
    class ByteVector;
    class String;
    namespace ID3v1
    {
        class StringHandler;
    }
}

class QTextCodec;

class ID3v1StringHandler : public StringHandler
{
    private:
        QTextCodec *m_codec;

    public:
        ID3v1StringHandler();

        virtual String parse(const ByteVector &data) const;

        void setCodec(int index);
};

//id3v1stringhandler.cpp

#include <qtextcodec.h>
#include <tstring.h>
#include <id3v1tag.h>
#include <tbytevector.h>

#include "id3v1stringhandler.h"

ID3v1StringHandler::ID3v1StringHandler()
{
    m_codec=QTextCodec::codecForLocale();
}

void ID3v1StringHandler::setCodec(int index)
{
    m_codec=QTextCodec::codecForIndex(index);
}

String ID3v1StringHandler::parse(const ByteVector &data) const
{
    return QStringToTString(m_codec->toUnicode(data.data(), data.size()));
}

Пытаюсь скомпилить:
$ g++ -c id3v1stringhandler.cpp -I$QTDIR/include -I/usr/include/taglib -L$QTDIR/lib -lqt-mt -ltag

В ответ куча ругани, если все инклуды прописываю в id3v1string.h и говорю using namespace std; то все работает, но тогда появляются конфликты в основном проекте.

Вопрос: Как-же это все победить?:)
★★

Ответ на: комментарий от svyatogor

[light@localhost amarok]$ g++ -c id3v1stringhandler.cpp -I$QTDIR/include -I/usr/include/taglib -L$QTDIR/lib -lqt-mt -ltag
In file included from id3v1stringhandler.cpp:6:
id3v1stringhandler.h:14: error: syntax error before `{' token
id3v1stringhandler.h:21: error: syntax error before `(' token
id3v1stringhandler.h:24: error: syntax error before `}' token
id3v1stringhandler.cpp:9: error: invalid use of undefined type `class
   ID3v1StringHandler'
id3v1stringhandler.h:13: error: forward declaration of `class
   ID3v1StringHandler'
id3v1stringhandler.cpp: In constructor `
   ID3v1StringHandler::ID3v1StringHandler()':
id3v1stringhandler.cpp:10: error: `m_codec' undeclared (first use this
   function)
id3v1stringhandler.cpp:10: error: (Each undeclared identifier is reported only
   once for each function it appears in.)
id3v1stringhandler.cpp: At global scope:
id3v1stringhandler.cpp:14: error: invalid use of undefined type `class
   ID3v1StringHandler'
id3v1stringhandler.h:13: error: forward declaration of `class
   ID3v1StringHandler'
id3v1stringhandler.cpp:18: error: syntax error before `::' token
[light@localhost amarok]$

Вот дикларация TagLib::ID3v1::StringHandler
http://developer.kde.org/~wheeler/taglib/api/classTagLib_1_1ID3v1_1_1StringHandl
er.html

Delay ★★
() автор топика

Разберись с namespaces...
Например, судя по твоему хидеру, объявление класса
должно быть таким:

class ID3v1StringHandler : public TagLib :: ID3v1 :: StringHandler
и
virtual TagLib::String parse(const TagLib::ByteVector &data) const;

Можешь попользоваться
uses namespace TagLib;
uses namespace TagLib::ID3v1; //Хотя я не пробовал с вложенными...

OlegY
()
Ответ на: комментарий от OlegY

Спасибо, все работает!
Нкжно было просто немного поспать:)

Delay ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.