为什么我不能返回typedef'd类型的引用

Dav*_*ita 1 c++ typedef return reference

想象一下这段代码:

class foo
{
    foo fff;
    int m_id;

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

typedef foo f;
Run Code Online (Sandbox Code Playgroud)

这将编译正常,但这一个:

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;
Run Code Online (Sandbox Code Playgroud)

有什么不同?为什么它不适用于类Code并与类foo一起使用?抱歉我的英语不好:)

我得到了几个错误,其中一个是"Missing type specifier - int CodeList & children() { return m_Children; } assume ",我假设编译器在处理Code类中的CodeList成员时没有处理typedef CodeList,但我不明白为什么它是为第一个案件工作.如果我写下面的内容:

class Code;

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

class QX_SERVICE_DLL_EXPORT Code
{
...
Run Code Online (Sandbox Code Playgroud)

一切正常.顺便说一下,我正在使用MSVC 2010编译器

Dav*_*eas 9

这是错的:

typedef CodeList qx::QxCollection<long, QSharedPointer<Code> >;
Run Code Online (Sandbox Code Playgroud)

你可能意味着:

typedef qx::QxCollection<long, QSharedPointer<Code> > CodeList;
Run Code Online (Sandbox Code Playgroud)

我很确定编译器应该在该行代码中提供了错误消息,因此我的建议是读取错误消息.如果没有,那么您可能没有包含声明typedef的标头... 包含它.另外在声明它的标题中,你不能它被声明之前使用它(C++进程从上到下,或者在大多数情况下至少......)