我有一个由三层组成的代码。在最高级别有一个大师班。然后有一个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;
}
答案 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必须使用两个参数进行模板化 - 一个用于自身,一个用于与其一起使用的网格。