0

我有两个类,它们的函数将相互定义的指针作为返回值和参数。IE:

class Segment;

class Location : public Fwk::NamedInterface {
  public:
    // ===== Class Typedefs =====
    typedef Fwk::Ptr<Location const> PtrConst;
    typedef Fwk::Ptr<Location> Ptr;
    // ===== Class Typedefs End =====
    void segmentIs(Segment::Ptr seg);
    /* ... */
}

和上课地点;

class Segment : public Fwk::NamedInterface {
  public:
    // ===== Class Typedefs =====
    typedef Fwk::Ptr<Segment const> PtrConst;
    typedef Fwk::Ptr<Segment> Ptr;
    // ===== Class Typedefs End =====
    void locationIs(Location::Ptr seg);
    /* ... */
 }

这可以理解地产生链接器错误......各个类的前向声明无法修复。如何在将这些 typedefs 保留在类内部的同时转发声明PtrPtrConsttypedefs(即我想写Location::Ptr来引用位置指针类型)?

谢谢各位!

4

2 回答 2

1

那里有一个隐藏的元函数,它接受一个类型T并返回Fwk::Ptr< T >。你已经实现了这个元函数两次。在类中实现它会引入元函数对类的错误依赖。

要删除此错误依赖项,请在执行其他任何操作之前实现元功能。

template< typename T >
using FwkPtr = Fwk::Ptr< T >;

(编辑:这是一个 C++03 风格的元函数。

template< typename T >
struct FwkPtr {
    typedef Fwk::Ptr< T > type;
};

然后你会参考FwkPtr< Segment >::type,或者如果元函数应用于模板参数或其结果,typename FwkPtr< T >::type。)

如果在将来Segment并且Location被模板化,因此他们的Ptr成员可能是别的东西,那么问题就会因为延迟评估而消失。但修复仍然有效,并且在概念上仍然有效。

您可能(最终)让元函数计算其他东西,或者拥有多个元函数。关键是你不需要整个类来做,它也不是类封装的功能。

另一方面,如果参数肯定总是Fwk::Ptr< Segment >and Fwk::Ptr< Location >,您可以这样指定它们并回避问题。

于 2013-11-06T01:51:23.387 回答
0

您无法访问尚未声明的类型

class Location : public Fwk::NamedInterface {
  public:
    // ===== Class Typedefs =====
    typedef Fwk::Ptr<Location const> PtrConst;
    typedef Fwk::Ptr<Location> Ptr;
    // ===== Class Typedefs End =====

    // this is illegal
    void segmentIs(Segment::Ptr seg);
};

相反,请尝试在课堂外进行 typedef'ing。

class Segment;
class Location;
typedef Fwk::Ptr<Segment>  SegmentPtr;
typedef Fwk::Ptr<Location> LocationPtr;

class Location : public Fwk::NamedInterface {
  public:
    // ===== Class Typedefs =====
    typedef Fwk::Ptr<Location const> PtrConst;
    // ===== Class Typedefs End =====
    void segmentIs(const SegmentPtr& seg);
};
于 2013-11-06T01:41:21.653 回答