我有两个类,其函数将typedefed指针作为返回值和参数。即:
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);
/* ... */
}
这可以理解地生成链接器错误......各个类的前向声明无法修复。我怎样才能转发声明Ptr
和PtrConst
typedef,同时将这些typedef保持在类的内部(即我想写Location::Ptr
来引用位置指针类型)?
谢谢大家!
答案 0 :(得分:1)
其中有一个隐藏的元函数,它采用类型T
并返回Fwk::Ptr< T >
。您已经两次实现了这个元函数。在类中实现它会引入元函数对类的错误依赖。
要删除此虚假依赖项,请在其他任何内容之前实现元函数。
template< typename T >
using FwkPtr = Fwk::Ptr< T >;
(编辑:这是一个C ++ 03风格的metafuction。
template< typename T >
struct FwkPtr {
typedef Fwk::Ptr< T > type;
};
然后你会引用FwkPtr< Segment >::type
,或者如果元函数应用于模板参数或其结果typename FwkPtr< T >::type
。)
如果将来Segment
和Location
被模板化,因此他们的Ptr
成员可能是其他成员,那么由于评估延迟,问题就会消失。但修复仍然有效,并且它在概念上仍然有效。
你可能(最终)让元函数计算其他东西,或者有多个元函数。关键是你不需要整个类来完成它,它不是由类封装的功能。
另一方面,如果参数始终是Fwk::Ptr< Segment >
和Fwk::Ptr< Location >
,您可以这样指定它们并回避问题。
答案 1 :(得分: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。
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);
};