#include "boost/numeric/ublas/matrix.hpp"
using namespace boost::numeric::ublas;
template <class matrixform,class input_T>
class Layer
{
private:
matrixform <input_T>;
public:
};
我希望能够做到
int main ()
{
Layer<identity_matrix, double> mylayer;
}
但是
layer.hpp:18:错误:'matrixform'是 不是模板layer.hpp:18:错误: 声明不宣布任何内容
答案 0 :(得分:3)
您需要使用模板模板参数:
template <template <class> class matrixform, class input_T>
class Layer { /* ... */ };
请注意,为了使用模板模板参数,作为参数提供的模板必须具有与列表完全匹配的参数。因此,在此示例中,只有采用一个类型参数的模板可用于实例化Layer
。
这是一个问题,特别是因为类模板参数可以有一个默认参数。例如,Boost identity_matrix
类有两个模板参数:要使用的类型和分配器,因此它不能用于实例化Layer
(allocator参数有一个默认参数)。 / p>
您可以做的是将要使用的实例化模板作为模板参数,并从该类型定义的typedef中获取input_T
。例如:
template <typename MatrixT>
class Layer
{
typedef typename MatrixT::value_type ValueT;
};
MatrixT
以下是您的示例中的matrixform<input_T>
,ValueT
是您的input_T
。
这可以实例化为,
Layer<identity_matrix<double> > mylayer;
答案 1 :(得分:0)
template <class templatedmatrixform>
class Layer
{
private:
templatedmatrixform matrix;
public:
};
template<typename T>
class identity_matrix
{
typedef T input_T;
};
int main ()
{
Layer<identity_matrix<double> > mylayer;
}