[RESOLU][C++] Unresolved symbols

Bonsoir la zone,

J’essaie de faire un code Cplouchplouch ultra propre et ultra relou pendant la compilation, histoire qu’il m’emmerde dès que je fais une erreur .
J’ai déja un code de base, et j’ai “tuné” qqes opérateurs sur une classe ‘Color’.

Color.h

[code]class Color
{
protected:
double m_R,m_G,m_B;
double m_A; // composante alpha
public:
Color();
Color(double R,double G,double B,double A = 1);
double GreyLevel() const;
Color(const Color &color);
virtual ~Color();

	Color &operator = (const Color& color); 
	inline const Color  operator + (const Color &color) const; //voila les 4 operateurs
	inline const Color  operator - (const Color &color) const; // que j'ai bidouillés
	inline const Color  operator * (double a) const;			  // en rajoutant inline const  ... (const) const
	inline const Color  operator * (const Color & color) const;
	inline const Color  operator / (double a) const;

	COLORREF	REF();  // code Color de windows

};[/code]

implémentés comme suit:

Color.cpp

[code]inline const Color Color::operator+(const Color &rhs) const
{
return Color(m_R + rhs.m_R,
m_G + rhs.m_G,
m_B + rhs.m_B,
m_A + rhs.m_A);
}

inline const Color Color::operator*(double rhs) const
{
return Color(m_Rrhs,
m_G
rhs,
m_Brhs,
m_A
rhs);
}[/code]
et je les utilise dans une autre classe comme ceci:

Texture.cpp

[code]const Color Texture::Interpol(double x,double y) const
{
int xx,yy;
double cx,cy;
double ccx,ccy;

while ( x < 0 ) x += m_wWidth;
while ( y < 0 ) y += m_wHeight;
while ( x >= m_wWidth ) x -= m_wWidth;
while ( y >= m_wHeight ) y -= m_wHeight;

xx = int(x);
yy = int(y);

cx=x-xx;
cy=y-yy;

ccx=cx*cx;
ccy=cy*cy;

return	  GetColor(xx  ,yy  ) * (1-ccx)*(1-ccy)
		+	GetColor(xx+1,yy  ) * ccx*(1-ccy)
		+	GetColor(xx  ,yy+1) * (1-ccx)*ccy
		+	GetColor(xx+1,yy+1) * ccx*ccy;

}[/code]

Et voila que le compilateur me sort ces deux erreurs que j’ai djà un peu de mal a lire, et je ne trouve pas ce qu’il a à me reprocher:
[ul]
[li]Error 1 error LNK2019: unresolved external symbol "public: class Color const __thiscall Color::operator+(class Color const &)const " (??HColor@@QBE?BV0@ABV0@@Z) referenced in function "protected: class Color const __thiscall Texture::Interpol(double,double)const " (?Interpol@Texture@@IBE?BVColor@@NN@Z) texture.obj Projet IMA[/li][li]Error 2 error LNK2019: unresolved external symbol "public: class Color const __thiscall Color::operator*(double)const " (??DColor@@QBE?BV0@N@Z) referenced in function "protected: class Color const __thiscall Texture::Interpol(double,double)const " (?Interpol@Texture@@IBE?BVColor@@NN@Z) texture.obj Projet IMA[/li][/ul]

Pourquoi il ne prend pas mes opérateurs?

EDIT: ajout extrait Color.cpp

inline et const c’est pas incompatible ? Sans l’un ou l’autre ca passe pas mieux ?

lequel ? le 1er const du type de retour, le const sur la fonction, ou sur le paramètre?

Je vais tester dès que tu me réponds, mais j’espère pas que c’est ca, car j’en ai pleins dans le livre que je lis en ce moment et qui est censé être ZE référence (Effective C++, Scott Meyers)

EDIT: si je dégage le inline, ca marche parfaitement, mais si je pouvais éviter, ca serait top.

Quel est le const en trop et pquoi est il incompatible, du coup? oO

oohhhh j’ai pigé!

Les fonctions inline doivent déclarées ET definies dans le header et non dans le cpp. Sinon ca resoud pas les symboles. Aucune idée de pourquoi (et je trouve ca assez peu élégant), mais ok.

Merci AnA-l=)

Lorsque tu compiles un fichier .cpp faisant appel à une fonction inline, le compilateur doit insérer le code de ta fonction inline à la place de l’appel à la fonction. Pour ça il faut qu’il ait accès à la définition de ta fonction, qui doit être connue du .cpp que tu compiles (donc se trouver dans un header). Il en est de même avec les templates. C’est pas focément l’idéal pour isoler le client du header de l’implémentation des fonctions, mais l’inlining est à ce prix.

Et je confirme, le bouquin de Scott Meyers (en fait la série, de Effective C++ à Effective STL en passant par More Effective C++) est excellent. Je dirais pas que c’est une référence du langage (c’est pas même but que les bouquins de Stroutstrup ou celui de Josuttis pour la STL), mais c’est une fantastique compilation de best practices que tout programmeur C++ se doit de connaître. Clairement indispensable.

Oui, en fait, c’est effectivement pas le const qui posait souci mais le inline, qui fonctionne comme un #define dans le fond. Et +1 doc_toise, on les a au taff, c’est des references de bonnes practices.

oui, inline tout ca, dans le cpp pas bien… Le truc rigolo c’est que j’ai fixe le meme bug dans notre code y a pas 3 jours :smiley:
Par contre, ca:[codebox] while ( x < 0 ) x += m_wWidth;
while ( y < 0 ) y += m_wHeight;
while ( x >= m_wWidth ) x -= m_wWidth;
while ( y >= m_wHeight ) y -= m_wHeight;[/codebox]

C’est super cracra!

pas mon code :smiley: je me contente de changer qqes trucs au fur et a mesure de mes lectures.
Je ferais bien remonter la chose, mais vu que l’auteur est aussi celui qui me note (erm)… J’attendrais d’etre diplomé :smiley:

J’ai encore qqes soucis (nottamment sur les exceptions chez VC++, j’essaie d’empecher la creation d’un objet mais je recupere bcp de warnings lors de la compilation) mais je posterais ca demain matin.