C++ 生成对象时宏与模板的组合

C++ 生成对象时宏与模板的组合,c++,qt,templates,c++11,macros,C++,Qt,Templates,C++11,Macros,我创建了一个模板类,用于填充T类的一些对象,但是T类的对象在网络中共享,我不想提供有关它们的信息,因此我为每个T类创建了一个帮助器类和一个宏: class Entity { // just Properties } class EntityHelper{ // needed method for fill from database } #define DBH(x) x##Helper 这是上下文类的一个函数,用于填充对象列表 template<class

我创建了一个模板类,用于填充T类的一些对象,但是T类的对象在网络中共享,我不想提供有关它们的信息,因此我为每个T类创建了一个帮助器类和一个宏:

 class Entity {
     // just Properties
 }
 class EntityHelper{
    // needed method for fill from database
 }

 #define DBH(x) x##Helper
这是上下文类的一个函数,用于填充对象列表

 template<class T> 
 QList<T> ContextClass::query(const QString& q){
    T inst;
    DBH(T) helper;
    // and another methods
 }
模板
QList ContextClass::query(const QString&q){
T inst;
胸径(T)辅助;
//还有另一种方法
}
我得到一个未声明的标识符错误!! 如果我不使用函数m->query(q);我没有得到错误??
我知道我可以用另一种方法来做这件事,但这种方法有什么错

更新:

好吧,看来我必须用另一种方法,我用过这个

template <class T>
class Helper {
    Helper<T>* createInstance();
    //some methods
}

class EntityHelper : public Helper<Entity>
{
     EntityHelper* createInstance();
      // query needed for entity table database
}
模板
类助手{
Helper*createInstance();
//一些方法
}
类EntityHelper:公共帮助程序
{
EntityHelper*createInstance();
//需要查询实体表数据库
}

记住宏只是文本替换,因此您的代码变成:

 template<class T> 
 QList<T> ContextClass::query(const QString& q){
    T inst;
    THelper helper;
    // and another methods
 }
模板
QList ContextClass::query(const QString&q){
T inst;
帮手;
//还有另一种方法
}
这是胡说八道

在您的情况下,只需使用模板:

template<class T>
class Helper;

template<>
class Helper<Entity>
{
    // needed method for fill from database
};

template<class T> 
QList<T> ContextClass::query(const QString& q){
   T inst;
   Helper<T> helper;
   // and another methods
}
模板
班级助理;
模板
类助手
{
//从数据库填充所需的方法
};
模板
QList ContextClass::query(const QString&q){
T inst;
帮手;
//还有另一种方法
}

我不想提供关于它们的信息
你到底想实现什么?我的实体只是一个DTO对象,我与其他应用程序共享这个对象,所以我不想在这个对象中保留诸如列名和表之类的数据库信息,一个EntityHelper知道所有关于数据库的东西我每个Helper都有不同的类成员,每个Helper都是静态定义我也不能使用这个,为什么我不使用这个函数我没有任何错误?我确实遇到了一个错误,也许你可以给我们展示更多的代码?请注意,您可以为每个
T
专门化
Helper
,这样它们就可以有不同的类成员。如果我添加一个THelper类只是为了不出错,对于另一个T,它总是使用THelper或用类名替换T,我的意思是编译器首先替换宏,然后创建模板函数?好的,看来我必须使用您的建议,但是我如何使用不同的派生类Helper您想从
Helper
派生什么?你知道你可以专门化
Helper
模板吗?我更新了代码来澄清这个想法。