2009-07-23 12 views
0

Je le modèle suivant:Problème compilation du code modèle de C

template<class Matrix> 
Matrix horizontal_join (const Matrix& m1, const Matrix& m2) { 

ASSERT (rows (m1) == rows (m2), "unequal number of rows"); 
typedef typename Matrix::value_type Scalar; 
Matrix r (rows (m1), nbcol (m1) + nbcol (m2)); 
    for (unsigned i=0; i<nbrow(m1); i++) { 
     for (unsigned j=0; j<nbcol(m1); j++) 
    r(i,j)= m1(i,j); 
     for (unsigned j=0; j<nbcol(m2); j++) 
    r(i,j+nbcol(m1))= m2(i,j); 
    } 
    return r; 
} 

défini dans une bibliothèque appelée "MATRDSE.m". Il est également défini une structure appelée "matrsdse" dans un fichier "matrdse.hpp" qui représente un type de matrice dense et qui a plusieurs

-constructors, par exemple matrdse (int nrRows, int nrCols, const value_type * src, ByRow())

-et des méthodes, par exemple transposer().

Je veux utiliser le modèle « de horizontal_join » dans ma fonction principale:

#include <matrdse.hpp> 
#include <MATRDSE.m> 

typedef matrdse<double> MxPoly;  

int main{ 

    double v[]={1,2,1,1,3,4,2,2,5,5,5,5,-2, 1,2,3,1, -2.8,-2.4,1,.2,5.8}; 
matrdse<double> A(4,4,v,ByRow()); 
std::cout<<"A="<<endl<<A<<endl; 
matrdse<double> AT(A); 
AT.transpose(); std::cout<<"Transpose(A)="<<endl<<AT<<endl; 
MxPoly B; 
B=horizontal_join<MxPoly>(A,AT); 
cout<<B<<endl; 

    return 0; 

} 

Tout fonctionne très bien, jusqu'à ce que « horizontal_join » est appelé et retourné dans B. j'obtiens l'erreur de compilation suivante:

main.cpp:168: error: 'horizontal_join' was not declared in this scope 
main.cpp:168: error: expected primary-expression before '>' token 

Je ne comprends pas l'erreur. Comme je le vois, je ne sais pas comment appeler le modèle ..

Nous vous remercions à l'avance pour toute suggestion, madalina

+1

Avez-vous inclus l'en-tête de ce modèle? – sharptooth

+0

oui, j'ai, j'ai oublié de l'inclure dans la question ici.Désolé – madalina

+0

S'il vous plaît rendre le titre de la question plus descriptif. "l'utilisation de modèles" ne donne aucune idée de ce dont il s'agit. Suggestion: "Erreur de confusion lors de l'appel de la fonction de modèle C++" – flodin

Répondre

0

Je suppose que le problème est la combinaison de votre macro préprocesseur ici (est-ce même droit , avez-vous le nom de la macro avant le type):

#define matrdse<double> MxPoly; 

et le modèle instanciation ici:

B=horizontal_join<MxPoly>(A,AT); 

Notez que le instantiat ligne ionique se développe dans le préprocesseur à ceci:

B=horizontal_join<matrdse<double>>(A,AT); 

La chose modèle-modèle se terminant par >> est une erreur du compilateur bien connu qui est masqué ici par la macro. Je suppose que si vous changez la ligne instanciation de modèle pour cela, il en va:

B=horizontal_join<MxPoly >(A,AT); 

Je suggère que vous devez utiliser une dénomination plus cohérente et faveur typedef sur macro car il ne rencontrera pas ce problème:

typedef matrdse<double> MxPoly; 
+0

Parlez d'avoir la même réponse! :-) –

+0

J'ai commencé comme ça, j'ai la même erreur. – madalina

+0

La macro #define matrdse MxPoly; indique au préprocesseur de remplacer le jeton 'matrdse' par les jetons' MxPoly; ' –

0

#define matrdse<double> MxPoly;

un point-virgule pour beaucoup

1

Est-ce le code réel ? Vous avez le #define (une mauvaise idée en soi) inversé. Il doit être

#define MxPoly matrsde<double> 
+0

J'ai utilisé typedef matrdse MxPoly; Désolé pour l'erreur de frappe. – madalina

+0

est 'polynomial_t' le même que' double'? Sinon, il y a votre problème. – Ari

+0

oui en effet c'était l'erreur. J'ai besoin typedef matrdse MxDouble; pour le gabarit utilisé avec cette double matrice pas vraiment une matrice de polynômes. – madalina

Questions connexes