如何让非模板化管理器接受模板化对象?

时间:2012-08-13 16:34:14

标签: c++ templates

我制作了一个通用的属性模板。每个属性只有一个值,例如float,int,string等。当实例化属性时,它会尝试使用属性管理器singleton注册自己。但是,我无法弄清楚如何使PropertyManager :: AddProperty()方法获取属性。它通过一条消息声明该属性需要一个类型名称来保持错误。这通常是怎么做的?

template <typename T> class Property
{
public:
    Property(T value)
    { 
        mID = ThePropertyManager->AddProperty( Property* p ); 
    } 
        T mValue;
    ULONG mID;
}

3 个答案:

答案 0 :(得分:0)

    mID = ThePropertyManager->AddProperty( Property* p ); 

语法无效,有两种方式,需要

    mID = ThePropertyManager->AddProperty(this); 

如果没有看到其他代码,很难确定,但只要AddProperty本身是模板化的,那么这应该可行。

此外,您可能希望在构造函数中初始化mValue,即

Property(T value) : mValue(value)
{ 
    ...
} 

答案 1 :(得分:0)

PropertyManager类可以具有模板成员函数,该函数采用Property的各种实例化:

class PropertyManager
{
public:
    template <class TY> ID AddProperty(Property<Ty>&);
};

另请注意,示例代码不正确:

mID = ThePropertyManager->AddProperty( Property* p );

应该是这样的:

mID = ThePropertyManager->AddProperty(this);

答案 2 :(得分:0)

你可以从一个抽象基类继承Property,比如没有模板化类型的AbstractProperty,然后让PropertyManager接受AbstractProperty个参数。如果您将Property与整数,浮点数等一起使用,这也将支持多个Property模板化类。

虽然听起来好像你需要一个模板化的物业经理。