如何使模板类前向声明

时间:2014-01-21 06:24:47

标签: c++

我计划了这个可爱的小装置(嗯,我认为它很甜):

template< typename T>
class CInterfaceT
{
    //a purely virtual interface declaration
};


template< typename T, typename SomeOtherStuff >
class CImplementationT : public CInterfaceT<T>
{
    //implemenation stuff
};

然后:

typedef CInterfaceT<CFoo> IFooInterface;
typedef CInterface<CBar>  IBarInterface;

class CObnoxiousHolder
{
public:
IFooInterface* GetFoo() { return &m_Foo; }
IBarInterface* GetBar() { return &m_Bar; }

private:
CImplementationT <CFoo, someting>  m_Foo;
CImplementationT <CBar, otherting> m_Bar;
};

问题是,那些typedefed“接口”必须在C ++ CLI项目中使用,该项目依赖于以下内容来导入非托管代码:

class IFooInterface;
typedef IFooInterface CFooCppInterface;

显然,这是有效的。或者曾经使用正确声明的接口类,现在不能正常工作,因为你无法向前声明模板实例。

膝盖反射解决方案是声明一些适当的接口类而不是typedef:

class IFooInterface : public CInterfaceT<CFoo> {};
class IBarInterface : public CInterfaceT<CBar> {};

但这搞砸了GetFoo() - 类似的getter方法,因为这些新接口现在与正确的实现类几乎没有关系。

我仍然非常喜欢这里的模板方法,因为它节省了相当多的样板。我该如何解决?

编辑:解决方案很简单:使用更多模板!

template< typename T, typename Q, typename SomeOtherStuff >
class CImplementationT : public Q
{
    //implemenation stuff
};

2 个答案:

答案 0 :(得分:0)

只是一个猜测 - 你需要这样的东西吗?

template<> class CInterfaceT<CFoo>;
typedef CInterfaceT<CFoo> CFooCppInterface;

而不是;

class IFooInterface;
typedef IFooInterface CFooCppInterface;

部分专业的模板无法向前声明。

答案 1 :(得分:0)

编辑后,基本上 - 我在实现模板接口而不是正确的接口时使用静态多态。