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++;使用指向模板对象的指针_C++_Templates_Pointers_Template Specialization - Fatal编程技术网

C++ C++;使用指向模板对象的指针

C++ C++;使用指向模板对象的指针,c++,templates,pointers,template-specialization,C++,Templates,Pointers,Template Specialization,我有一个名为ABC的类,它有一个类模板: template <class T> class ABC{} 模板类ABC{} 在另一个类中,我尝试将对象ABC存储在列表中: class CDE{ private: list<ABC *> some_list; } CDE类{ 私人: 列出一些清单; } 我打算存储可能具有不同类模板参数的ABC对象。是否有必要在编译时为指针指定模板?如果容器应该存储不同类型的对象呢?这不可能吗?您需要在CDE类中指定模板参数,或者

我有一个名为ABC的类,它有一个类模板:

template <class T> class ABC{}
模板类ABC{}
在另一个类中,我尝试将对象ABC存储在列表中:

class CDE{
private:
  list<ABC *> some_list; 
}
CDE类{
私人:
列出一些清单;
}

我打算存储可能具有不同类模板参数的ABC对象。是否有必要在编译时为指针指定模板?如果容器应该存储不同类型的对象呢?这不可能吗?

您需要在
CDE
类中指定模板参数,或者使
CDE
也成为模板

第一种选择:

class CDE {
private:
    list< ABC<int>* > some_list;
};
CDE类{
私人:
列出一些清单;
};
第二种选择:

template <class T>
class CDE {
private:
    list< ABC<T>* > some_list;
};
模板
类CDE{
私人:
列出一些清单;
};
是否有必要在编译时为指针指定模板

如果容器应该存储不同类型的对象呢?这不可能吗

这(直接)是不可能的

没有ABC类的东西。只有ABC的实例化,例如
ABC
ABC
。这些是完全不同的类

您可以执行以下操作:

template<typename T>
class ABC : public ABC_Base
{
  ...
}

list<ABC_Base*> some_list;
模板
ABC类:公共ABC_基地
{
...
}
列出一些清单;

通过这样做,所有ABC实例都有一个通用的基类型,并且您可以任意使用基指针。

列表只能存储一个类型。模板的不同实例化是不同的类型。如果这是令人满意的,您可以这样做:

模板类CDE{private:list some_list;}


如果需要使用不同的类型,也许可以为ABC创建一个非模板基类,并存储指向该基类的指针。(即使用界面)

这听起来很合理,但有一点缺点。使用模板的全部原因是为了确保对象紧密耦合。这样,仍然有机会创建ABC_Base对象(或其派生类),而不使用模板类型,并在列表中使用它们。@cyrux如果将
ABC_Base
抽象化,则没有人可以创建
ABC_Base
的对象。