1

我一直在与以下问题作斗争:

我的应用程序中有几种数据类型,它们的使用方式如下(非常简化的代码):

QVector<Function*> Container::getFunctions() {return mFunctions};
QVector<Procedure*> Container::getProcedures() {return mProcedures};
....
QVector<Function*> mFunctions;
QVector<Procedure*> mProcedures;

两者FunctionProcedure都派生自一个ObjectWithUid具有

virtual QString getClassUid() = 0;

并且两者FunctionProcedure实现了虚拟方法,并且它们中的每一个都返回各自的类 uid(对于函数 this is"CUID_FUNC"和对于过程 this is "CUID_PROC")。

现在,我在其他地方有一个方法:

template <class T> void showObjectList(const QVector<T*> items)
{
   // show the list of objects
}

使用如下:

showObjectList(getFunctions());

或者

showObjectList(getFunctions());

正如预期的那样,我可以显示功能或过程。

但现在我希望能够根据某个对象的类 uid 显示列表,所以我需要如下代码:

ObjectWithUid* obj = giveMeMyObject();

showObjectList(< a vector to which the object belongs determined based on class UID >)

问题从这里开始

我写了以下方法:

template <class T> QVector<T*> getListOfObjectsForUid(const QString& uid)
{
    if(uid == uidFunction)
    {
        return getFunctions();
    }

    return QVector<T*>();
}

我正在尝试像这样使用它:

ObjectWithUid* obj = giveMeMyObject();

showObjectList(getListOfObjectsForUid(obj->getClassUid()));

编译器大喊:error: no matching function for call to getListOfObjectsForUid(const QString&) candidate is template <class T> QVector<T*> getListOfObjectsForUid(const QString& uid)

我怎样才能实现我正在寻找的东西?IE:基于字符串属性返回不同对象的向量,我可以自动使用它而无需指定类型...

4

1 回答 1

0

您将不得不以某种方式静态指定 T 。

  showObjectList(getFunctions());

隐式指定T=Function*,但是

  showObjectList(getListOfObjectsForUid(obj->getClassUid()));

是模棱两可的,因为getListOfObjectsForUid返回类型中只有模板参数。

您可以手动解决歧义:

  showObjectList(getListOfObjectsForUid<ObjectWithUid>(obj->getClassUid()));

由于您的所有对象类型都继承自ObjectWithUid并且返回类型实际上是QVector<ObjectWithUid*>而不只是QVector<ObjectWithUid>.

于 2013-09-25T09:48:17.323 回答