c ++模板模板

时间:2010-08-14 14:52:28

标签: c++ templates

#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:错误:   声明不宣布任何内容

2 个答案:

答案 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; 
}