Почему я не могу вернуть ссылку типа typedef'd - PullRequest
1 голос
/ 27 марта 2012

Представьте себе этот код:

class foo
{
    foo fff;
    int m_id;

    f & work() { return fff; }
};

typedef foo f;

Это хорошо скомпилируется, но вот это:

class QX_SERVICE_DLL_EXPORT Code
{
public:
    Code() : m_Id(0) { ; }
    virtual ~Code() { ; }

    inline long id() const { return m_Id; }
    inline void setId(long id) { m_Id = id; }

    inline const QString & code() const { return m_Code; }
    inline void setCode(const QString & code) { m_Code = code; }

    inline const QString & name() const { return m_Name; }
    inline void setName(const QString & name) { m_Name = name; }

    inline const QSharedPointer<Code> & parent() const { return m_Parent; }
    inline void setParent(const QSharedPointer<Code> & parent) { m_Parent = parent; }

    CodeList & children() { return m_Children; }

private:
    long m_Id;
    QString m_Code;
    QString m_Name;
    QSharedPointer<Code> m_Parent;
    qx::QxCollection<long, QSharedPointer<Code>> m_Children;

    friend void registerOrm(qx::QxClass<Code> & t);
};

typedef qx::QxCollection<long, QSharedPointer<Code> > CodeList;

Какая разница? Почему он не работает с классом Code и работает с классом foo? Извините за мой ломаный английский:)

Я получаю несколько ошибок, одна из которых "Отсутствует спецификатор типа - предполагается, что int" на CodeList & children() { return m_Children; } Я предполагаю, что typedef CodeList не обрабатывается компилятором, когда он обрабатывает члены CodeList в классе Code, но я не понимаю, почему он работает в первом случае. Если я напишу следующее:

class Code;

typedef qx::QxCollection<long, QSharedPointer<Code>> CodeList;

class QX_SERVICE_DLL_EXPORT Code
{
...

Тогда все работает нормально. Кстати, я использую компилятор MSVC 2010

Ответы [ 2 ]

9 голосов
/ 27 марта 2012

Это неправильно:

typedef CodeList qx::QxCollection<long, QSharedPointer<Code> >;

Вы можете иметь в виду:

typedef qx::QxCollection<long, QSharedPointer<Code> > CodeList;

Я почти уверен, что компилятор должен был предоставить сообщение об ошибке в этой строке кода, поэтому я рекомендую прочитать сообщения об ошибках . Если это не так, то вы, возможно, не включили заголовок, в котором объявлен typedef ... включите его . Кроме того, в заголовке, где он объявлен, вы не можете использовать его до того, как было объявлено (процесс C ++ сверху вниз, или, в большинстве случаев, по крайней мере ...)

2 голосов
/ 27 марта 2012

Поместите typedef где-нибудь перед определением класса и поменяйте местами qx::QxColl…etc с CodeList:

typedef qx::QxCollection<long, QSharedPointer<Code> > CodeList;
class QX_SERVICE_DLL_EXPORT Code {
  ...
};
...