Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使非模板化管理器接受模板化对象?_C++_Templates - Fatal编程技术网

C++ 如何使非模板化管理器接受模板化对象?

C++ 如何使非模板化管理器接受模板化对象?,c++,templates,C++,Templates,我制作了一个通用属性模板。每个属性只有一个值,例如float、int、string等。当该属性被实例化时,它会尝试向属性管理器单例注册自身。但是,我不知道如何使PropertyManager::AddProperty()方法获取该属性。它不断出错,并显示一条消息,说明属性需要一个typename。这通常是如何做到的 template <typename T> class Property { public: Property(T value) { m

我制作了一个通用属性模板。每个属性只有一个值,例如float、int、string等。当该属性被实例化时,它会尝试向属性管理器单例注册自身。但是,我不知道如何使PropertyManager::AddProperty()方法获取该属性。它不断出错,并显示一条消息,说明属性需要一个typename。这通常是如何做到的

template <typename T> class Property
{
public:
    Property(T value)
    { 
        mID = ThePropertyManager->AddProperty( Property* p ); 
    } 
        T mValue;
    ULONG mID;
}
模板类属性
{
公众:
属性(T值)
{ 
mID=属性管理器->添加属性(属性*p);
} 
T值;
乌龙中路;
}
这个

在两个方面都是无效语法,需要

    mID = ThePropertyManager->AddProperty(this); 
如果看不到代码的其余部分,就很难确定,但是只要
AddProperty
本身是模板化的,那么这应该可以工作

您可能还想在构造函数中初始化
mValue
,即

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

PropertyManager类可以具有一个模板成员函数,该函数接受属性的各种实例化:

class PropertyManager
{
public:
    template <class TY> ID AddProperty(Property<Ty>&);
};
应该是这样的:

mID = ThePropertyManager->AddProperty(this);

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


尽管听起来您确实需要一个模板化的属性管理器。

PropertyManager需要从
属性访问哪些操作问题是调用类型擦除,但执行方法可能取决于您需要如何处理
属性
让管理者接受任何内容可能很困难。Hoh,使用模板化的属性管理器意味着什么?我的结局不是不止一个吗?我只想要一个物业经理,所以我想不惜一切代价避免这样做。但是回到你的另一个建议,使用抽象属性类,我喜欢这个想法。我要试试看。如果不知道“物业经理”应该做什么,就真的不可能给出一个有用的答案。抽象基类可能是解决方案,但这取决于问题所在。>哦,使用模板化属性>管理器意味着什么?我的结局不是不止一个吗?也许,避免不止一个会有点复杂。马蒂!你给了我正确的答案!它现在起作用了:)我会投你一票,但它说我需要超过15分才能做到。无论如何,谢谢你,伙计@user1527741您可以始终接受答案,并且它将为其提供绿色复选框AddProperty函数是一个成员函数。在不将整个PropertyManager模板化的情况下,我仍然可以将其模板化吗?@user1527741当然可以。您必须小心语法,以及
.cpp
vs
.h
文件中的内容,但请参见。
mID = ThePropertyManager->AddProperty( Property* p );
mID = ThePropertyManager->AddProperty(this);