2010-08-14 8 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: 
}; 

Je veux être en mesure de fairec template de du modèle

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

MAIS

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

Répondre

3

Vous devez utiliser un paramètre de modèle de modèle:

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

Remarque que, afin d'utiliser un paramètre de modèle de modèle, le templat e fourni en tant qu'argument doit avoir des paramètres qui correspondent exactement à la liste. Ainsi, dans cet exemple, seul un modèle prenant un paramètre de type peut être utilisé pour instancier Layer.

Ceci est un problème, d'autant plus qu'un paramètre de modèle de classe peut avoir un argument par défaut. La classe Boost identity_matrix, par exemple, a deux paramètres de modèle: le type et l'allocateur à utiliser, donc il n'a pas pu être utilisé pour instancier Layer (le paramètre allocator a un argument par défaut). Ce que vous pouvez faire à la place est de prendre comme modèle le modèle instancié à utiliser, et obtenir le input_T à partir d'un typedef défini par ce type. Par exemple:

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

MatrixT ici est ce que matrixform<input_T> est dans votre exemple, et ValueT est votre input_T.

Cela peut être instancié comme,

Layer<identity_matrix<double> > mylayer; 
+0

+1, vous étiez 10 secondes plus vite. :) –

+0

pouvez-vous expliquer ce qu'il y a dans la classe? –

+0

@ismail: Qu'est-ce que vous ne comprenez pas exactement? (Et, pourquoi est-ce que taper "s'il vous plaît" est si difficile?) –

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 est déjà défini en boost, avec un tas d'autres comme triangular_matrix donc? –

+0

Je n'avais pas réalisé qu'il s'agissait d'une classe prédéfinie. Le typedef est là juste au cas où vous auriez besoin de ce type ailleurs dans Layer. Heureusement, la classe boost la définit comme 'value_type', donc où que vous utilisiez' input_T' dans votre classe Layer, vous pouvez utiliser 'templatedmatrixform :: value_type'. –