为什么我无法返回typedef" d类型的引用

时间:2012-03-27 19:14:59

标签: c++ reference return typedef

想象一下这段代码:

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一起使用? 抱歉我的英语不好:)

我收到了几个错误,其中一个错误是CodeList & children() { return m_Children; }处的“缺少类型说明符 - 假定为int” 我假设编译器在处理Code类中的CodeList成员时不处理typedef CodeList,但我不明白为什么它适用于第一种情况。如果我写下以下内容:

class Code;

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

class QX_SERVICE_DLL_EXPORT Code
{
...

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

2 个答案:

答案 0 :(得分:9)

这是错误的:

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

你的意思是:

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

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

答案 1 :(得分:2)

typedef置于类定义之前的某处,并将qx::QxColl…etcCodeList交换:

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