Problèmes de compilation avec des classes templates
johnstanp
Messages postés7Date d'inscriptiondimanche 2 février 2003StatutMembreDernière intervention 7 mai 2008
-
27 mars 2008 à 20:17
johnstanp
Messages postés7Date d'inscriptiondimanche 2 février 2003StatutMembreDernière intervention 7 mai 2008
-
27 mars 2008 à 22:40
Pour une raison qui m'échappe, mon compilateur(GCC sous Dev-cpp) me renvoie l'erreur suivante:
[b]
In file included from Vector3D.hpp:6,
from main.cpp:3:
Matrix3D.hpp:29: error: ISO C++ forbids declaration of `Vector3D' with no type
Matrix3D.hpp:29: error: expected `;' before '<' token
Matrix3D.hpp:71: error: expected constructor, destructor, or type conversion before '<' token
Matrix3D.hpp:71: error: expected `;' before '<' token
J'ai essayé de recompiler mes classes en me débarassant du caractère template(class Vector3D en lieu et place de Vector3D<T>,et float à la place de T) et j'ai le même problème.
A voir également:
Problèmes de compilation avec des classes templates
johnstanp
Messages postés7Date d'inscriptiondimanche 2 février 2003StatutMembreDernière intervention 7 mai 2008 27 mars 2008 à 20:24
Voici le contenu de l'entête Vector3D.hpp:
#ifndef VECTOR3D_HPP
#define VECTOR3D_HPP
#include
#include
#include "Matrix3D.hpp"
using namespace std;
template<class T>
class Vector3D
{
public:
T x;
T y;
T z;
Vector3D();
Vector3D( T _x , T _y , T _z );
Vector3D( const Vector3D<T>& v );
~Vector3D();
T operator*( const Vector3D<T>& v )const;
Vector3D operator*( const T a )const;
//Matrix3D<T> operator*( const Matrix3D<T>& )const;
Vector3D operator+( const Vector3D<T>& v )const;
Vector3D operator-( const Vector3D<T>& v )const;
Vector3D operator/( const T a )const;
Vector3D& operator+=( const Vector3D<T>& v );
Vector3D& operator-=( const Vector3D<T>& v );
Vector3D& operator*=( const Vector3D<T>& v );
bool operator!=( const Vector3D<T>& v )const;
bool operator==( const Vector3D<T>& v )const;
Vector3D opposite()const;
T squaredLength()const;
void print()const;
//Matrix3D<T> star()const;
template<class T>
istream& operator>>( istream& in , Vector3D<T>& v )
{
cout << "Enter x : ";
in >> v.x;
cout << "Enter y : ";
in >> v.y;
cout << "Enter z : ";
in >> v.z;
}
template<class T>
Matrix3D<T>::Matrix3D( T a, T b, T c, T d , T e, T f, T g, T h, T i )
: a_11(a) , a_12(b) , a_13(c) , a_21(d) , a_22(e) , a_23(f) , a_31(g) , a_32(h) , a_33(i){}
johnstanp
Messages postés7Date d'inscriptiondimanche 2 février 2003StatutMembreDernière intervention 7 mai 2008 27 mars 2008 à 21:53
J'ai déjà essayé cette solution sans succès.
Il s'agit à mon avis d'un problème assez subtil.
La surchage des opérateurs ">>" et "<<" ne me posait aucun problème,
jusqu'à ce que je tente de modifier quelque chose dans le code.
As-tu essayé de le compiler chez toi?
Evidemment tu devrais te débarasser de certaines inclusions de fichiers
dans le main.
Tente une fois de compiler chez toi et dis-moi ce qu'il en est.
Moi j'ai utilisé Dev-cpp.
johnstanp
Messages postés7Date d'inscriptiondimanche 2 février 2003StatutMembreDernière intervention 7 mai 2008 27 mars 2008 à 22:06
Pour les opérateurs ">>" et "<<",je viens de corriger le problème.
J'avais oublier de rajouter tous les using std::... après avoir supprimé
using namespace std.
Il n'empêche que le problème concernant la définition de Vector3D persiste:
j'ai tenté de réecrire le code sans templates(avec des floats à la
place de T,et j'ai toujours le même problème.Serait-ce un problème d'inclusion
de fichiers?
Vous n’avez pas trouvé la réponse que vous recherchez ?
johnstanp
Messages postés7Date d'inscriptiondimanche 2 février 2003StatutMembreDernière intervention 7 mai 2008 27 mars 2008 à 22:12
Ou alors,le type Vector3D<T> ne serait pas définit dans l'entête de Matrix3D.hpp,
d'où l'erreur à la compilation.
J'ai essayé de corriger le problème en définissant la surcharge de l'opérateur "*"
comme suit:
template<class T>
class Matrix3D
{
.
.
.
template<class U>
Vector3D operator*( const Vector3D& v )const;
johnstanp
Messages postés7Date d'inscriptiondimanche 2 février 2003StatutMembreDernière intervention 7 mai 2008 27 mars 2008 à 22:32
Le monologue va finalement prendre fin.J'ai trouvé la solution du problème(je veux dire j'ai trouvé sur google. lol)
Il suffisait de virer l'inclusion du header "Vector3D.hpp" du header "Matrix3D.hpp" et d'ajouter avant la définition de la classe Matrix3D,la définition de la classe Vector 3D.
johnstanp
Messages postés7Date d'inscriptiondimanche 2 février 2003StatutMembreDernière intervention 7 mai 2008 27 mars 2008 à 22:40
J'avais pas vu ton post.Tu as raison pour l'opérateur "<<" de Matrix3D,c'est "out <<" et non "cout<<" que je dois mettre.
Il semblerait que la solution de mon problème était de simplement mettre une définition de la classe Vector3D dans le header de Matrix3D sans inclure le fichier d'entête "Vector3D.hpp"...
L'erreur générée par le compilateur indique simplement que dans le header de Matrix3D,le type "Vector3D" est indéfini:il suffisait simplement de le définir avant de définir la classe Matrix3D...
J'avais essayé cette solution mais j'avais mis la définition suivante:
"template<class T> Vector3D" au lieu de la définition correcte,"template<class T> class Vector3D...