我正在测试一个属性系统,我想确保根类可以保存到最派生类的函数指针。结果我有一些工作。最派生的类当前正在工作(RC2),但是当前的中间类(RC1)将具有编译器错误。我希望能够实例化RC1和RC2。我在创建RC时会遇到的编译器错误(对于RC1<RC1> rc1test;
行)
错误C2955:'RC1':使用类模板需要模板参数列表
错误C3203:'RC1':非专用类模板不能用作模板参数'PropertyOwner'的模板参数,预计是真实类型
我试图做RC1<> rc1test;
,但这也没有帮助。这是来源,有没有人有任何建议?
#include <iostream>
#include <map>
#include <string>
using namespace std;
template<class T, class BaseClass>
class RBase : public BaseClass
{
public:
typedef int (T::*GetFP)(void) const;
protected:
std::map<const char*, GetFP> mGetFPs;
};
class CBase
{
};
template<class PropertyOwner>
class RC1;
template<class PropertyOwner=RC1>
class RC1 : public RBase<PropertyOwner, CBase>
{
public:
int int1(void) const
{
return 1;
}
RC1()
{
mGetFPs.insert( pair<const char*, GetFP>("RC1I1I", &PropertyOwner::int1) );
};
virtual void inspection(void)
{
int test = 0;
}
};
class RC2 : public RC1<RC2>
{
public:
int int2(void) const
{
return 2;
}
RC2()
{
mGetFPs.insert( pair<const char*, GetFP>("RC2I2I", &RC2::int2) );
};
virtual void inspection(void)
{
int test = 0;
}
};
int main(void)
{
RC1<RC1> rc1test;
RC2 rc2test;
rc2test.inspection();
return(0);
}
答案 0 :(得分:1)
template<class PropertyOwner=RC1>
class RC1 /*...*/;
如果模板类型参数PropertyOwner
存在默认参数,则它必须是类型。 RC1
不是类型。这是一个课堂模板。
答案 1 :(得分:1)
如果你可以使用boost那么你可以使用boost :: function和boost :: bind来做一个更干净的方法来获得你想要的指针。
template <typename BC>
class RBase : public BC
{
public:
typedef int FunctionSignature (void) const;
typedef boost::function<FunctionSignature> CallbackFunction;
protected:
std::map<const char*, CallbackFunction> mGetFPs;
};
class CBase
{
};
class RC1 : public RBase<CBase>
{
public:
RC1 ()
{
mGetFPs.insert ( std::make_pair ( "RC1I1I",
boost::bind ( &RC1::int1, this ) ) );
}
int int1(void) const { return 1; }
};
class RC2 : public RC1
{
public:
RC2 ()
{
mGetFPs.insert ( std::make_pair ( "RC2I2I",
boost::bind ( &RC2::int2, this ) ) );
}
int int2(void) const { return 2; }
};
实际上,你可以为boost :: function指定任何具有正确签名的函数,甚至可以使用boost :: bind来调整具有附加参数的函数(见下文)。
class RC3 : public RC1
{
public:
RC3 ()
{
mGetFPs.insert ( std::make_pair ( "RC3I3I",
boost::bind ( &RC3::intN, this, 3 ) ) );
}
int intN(int n) const { return n; }
};