创建模板类,该模板类将模板类作为构造函数中的参数

时间:2014-08-05 12:05:45

标签: c++ class templates initialization

我有一个由三层组成的代码。在最高级别有一个大师班。然后有一个Grid类,它知道Master,因为它将其函数用于一般任务。在Grid上,我可以创建Fields,它将Grid作为构造函数中的参数。现在,我想制作网格和字段模板,以使它们包含任意数据类型。

我没有设法让Field处理已正确提供给Grid的类型。原则上他应该能够推断出它。我该如何工作?当然,我的例子还没有编译。

#include <vector>

class Master
{
  public:
    Master() {};
};

template<class T>
class Grid
{
  public:
    Grid(Master &masterin) : master(masterin) {};
  private:
    Master &master;
    std::vector<T> data;
};

template<class T>
class Field
{
  public:
    Field(Master &masterin, Grid &gridin) : master(masterin), grid(gridin) {};
  private:
    Master &master;
    Grid   &grid;
    std::vector<T> data;
};

int main()
{
  Master master;
  Grid<int> grid(master);
  Field<double> field(master, grid);

  return 0;
}

2 个答案:

答案 0 :(得分:3)

template<class T>
class Field
{
  public:
    Field(Master &, Grid &);

这是无效的,您无法传递Grid类型的参数,因为Grid不是类型

  private:
    Master &master;
    Grid   &grid;

您不能拥有Grid类型的成员,因为它不是类型

您可以通过将构造函数设为模板来修复构造函数:

template<typename U>
    Field(Master &, Grid<U> &);

这将接受Grid模板专业化的任何类型,但您仍然无法拥有模板的成员变量,您需要确定Grid您的boost::any类型希望该成员成为,或将其存储在Field等灵活类型中。

如果您希望Grid能够使用任何类型的template<class T, class U> class Field { public: Field(Master&, Grid<U>&); private: Master& master; Grid<U>& grid; std::vector<T> data; }; ,那么它需要另一个模板参数:

Grid<U>

要推断出template<typename T, typename U> Field<T, U> make_field(Master& m, Grid<U>& g) { return Field<T, U>(m, g); } Master master; Grid<int> grid; auto field = make_field<double>(master, grid); // returns Field<double, int> 的类型,你可以定义一个生成器函数:

auto

但是,如果没有使用C ++ 11的Field<double, int> field = make_field<double>(master, grid); 关键字,使用起来不方便,并且无论如何都必须拼出完整类型,这并没有多大帮助:

{{1}}

答案 1 :(得分:1)

Grid是一个模板,因此它必须有一个模板参数才有用。根据您的示例,您似乎希望Grid和Field具有独立类型。这意味着Field必须使用两个参数进行模板化 - 一个用于自身,一个用于与其一起使用的网格。