2010-08-14 2 views
0
#include "boost/numeric/ublas/matrix.hpp" 
using namespace boost::numeric::ublas; 
template <class matrixform,class input_T> 
class Layer 
{ 
private: 
    matrixform <input_T>; 
public: 
}; 

Я хочу быть в состоянии сделатьC++ шаблон шаблон

int main() 
{ 
Layer<identity_matrix, double> mylayer; 
} 

НО

layer.hpp:18: error: ‘matrixform’ is not a template layer.hpp:18: error: declaration does not declare anything

ответ

3

Вам нужно будет использовать параметр шаблона шаблон:

template <template <class> class matrixform, class input_T> 
class Layer { /* ... */ }; 

Примечание что для использования параметра шаблона шаблона templat e, предоставленные в качестве аргумента, должны иметь параметры, которые точно соответствуют списку. Итак, в этом примере здесь может использоваться только шаблон с одним параметром типа для создания экземпляра Layer.

Это проблема, особенно потому, что параметр шаблона класса может иметь аргумент по умолчанию. Класс Boost identity_matrix, например, имеет два параметра шаблона: тип и распределитель, которые должны использоваться, поэтому он не может использоваться для создания экземпляра Layer (параметр распределителя имеет аргумент по умолчанию).

Вместо этого вы можете использовать в качестве параметра шаблона используемый экземпляр шаблона и получить input_T из typedef, определенного этим типом. Например:

template <typename MatrixT> 
class Layer 
{ 
    typedef typename MatrixT::value_type ValueT; 
}; 

MatrixT вот что matrixform<input_T> в вашем примере, и ValueT ваш input_T.

Это может быть реализован в виде,

Layer<identity_matrix<double> > mylayer; 
+0

+1, вы 10 секунд быстрее. :) –

+0

вы можете объяснить, что внутри класса? –

+0

@ismail: Что именно вы не понимаете? (И почему так печатать «пожалуйста»?) –

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; 
} 
+0

identity_matrix уже определен в boost, с кучей других, таких как triangular_matrix? –

+0

Я не понимал, что это был предопределенный класс. В typedef есть только то, что вам нужен этот тип в другом месте Layer. К счастью, класс boost определяет его как 'value_type', поэтому, если бы вы использовали' input_T' в своем классе Layer, вы можете использовать 'templatedmatrixform :: value_type'. –

Смежные вопросы