C++ 如何创建模板数组-c++;

C++ 如何创建模板数组-c++;,c++,C++,我用模板创建了一个优先级队列类。 把它命名为PQ。 如何创建一个PQ数组,其中每个元素都是不同类型的PQ 尝试这样做,但没有成功: template <class T> PQ<T> *arr[10]; //void pointer can point to everything arr[0] = new PQ<string>; arr[1] = new PQ<int>; 然后大体上我写道: Pointer_Base * arr[2]; P

我用模板创建了一个优先级队列类。 把它命名为PQ。 如何创建一个PQ数组,其中每个元素都是不同类型的PQ

尝试这样做,但没有成功:

    template <class T>
PQ<T> *arr[10]; //void pointer can point to everything
arr[0] = new PQ<string>;
arr[1] = new PQ<int>;
然后大体上我写道:

Pointer_Base * arr[2];
PQ<string> first;
PQ<int> second;
arr[0] = first;
Pointer_Base*arr[2];
PQ优先;
PQ秒;
arr[0]=第一;
它表示arr[0]=first行上的错误:

“从PQ到指针_base*exsit没有合适的转换”

如果我实现了虚拟函数,为什么会出现这个错误? 附笔:
showall函数只是在队列上运行,并打印队列中的所有值及其优先级。我知道我可能使用cout和运算符重载来完成此操作,但现在这样做更简单、更快。

这似乎是让
PQ
类从基类继承的完美选择,并存储
Base*
类型的
std::vector
std::array
。然后,您的
PQ
类将需要实现
Base
中定义的一些虚拟函数。这样的东西可能适合您的需要:

class base
{
  public:

    // virtual functions that every PQ must implement

     virtual ~base() {}

};

template<class T>
class PQ : public base
{
   // implement the virtual functions
};
类基
{
公众:
//每个PQ必须实现的虚拟功能
虚拟~base(){}
};
样板
PQ类:公共基地
{
//实现虚拟功能
};
然后要使用它,您可以使用如下内容:

std::vector<base*> priority_queues; // or even std::unique_ptr<base>
std::向量优先级\u队列;//甚至std::unique\u ptr
但是,如果您只需要在整个项目的一小部分中执行此操作,那么让
PQ
的所有实例都使用虚拟函数调用是没有意义的。您可以通过使用一个包装器类来解决这个问题,比如说
wrap
,它继承了前面提到的
base
,并在内部保存一个
PQ
。然后包装类可以将函数调用委托给内部结构。这样,您只需要在需要时为虚拟功能付费,而不是在整个项目中付费


此外,由于您的混合类型在这里,我假设您以后也将在项目中混合类型,为此我建议使用
boost::any

由于我没有关于PQ定义的线索,我无法帮助您实现这一点,您需要某种指向基本实现的指针,并让您的
PQ
类继承自基类,然后使您的数组(或向量)为
base*
类型。或者您可以选择类似于
boost::any
的内容。更一般地说,这些模板创建独特的类型。因此,您的问题更一般化:“如何创建一个可以容纳不同类型的数组?”这一问题在stackoverflow上已经被问了好几次,如果您敢的话,也可以回答一个
void*
。也就是说,不要这样做。尽可能使你的类型分开。其他任何东西都只是在询问bug。@maor因为它是一个指针数组,所以您需要首先说
arr[0]=&first或堆分配它们并存储一个
unique_ptr
数组。我正在尝试在不使用std的情况下解决这个问题。&确实解决了这个问题,但现在我得到了这个错误:“1>main.obj:error LNK2019:unresolved external symbol”public:virtual\uu thiscall Pointer\u Base::~Pointer\u Base(void)”(??1 Pointer\u Base)@@UAE@XZ)在函数uu unwindfunclet$??0中引用$PQ@H@@QAE@XZ$0 1>C:\Users\Navon\documents\visual studio 2013\Projects\maorproject3\Debug\maorproject3.exe:致命错误LNK1120:1未解析外部“我甚至不知道缺少了什么,但我不认为从长远来看,为了您自己的利益,这会有多大的效率。您可以管理自己的内存(并失去“标准内存”),但仍然使用这种方法。只需使用
new
/
delete
,而不是smartpointers@maor,您需要在基类中定义一个虚拟析构函数。您所做的是
virtual~Pointer_Base()。您需要的是
virtual~Pointer_Base(){}
ahh可以相信我错过的只是{}在Ctor和Dtor中。谢谢顺便说一句,如果我在基类中定义一个函数,然后在子类中编写一个同名函数,它不会运行在基类上吗?
class base
{
  public:

    // virtual functions that every PQ must implement

     virtual ~base() {}

};

template<class T>
class PQ : public base
{
   // implement the virtual functions
};
std::vector<base*> priority_queues; // or even std::unique_ptr<base>