Forums GeekZone: [RESOLU][C++] Unresolved symbols - Forums GeekZone

Aller au contenu

Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

[RESOLU][C++] Unresolved symbols oukèlélerreur? Noter : -----

Posté 27 octobre 2009 - 20:42 (#1) L'utilisateur est hors-ligne   Berzehk 

  • Lord Jedi Geek
  • PipPipPipPip
  • Groupe : Membre
  • Messages : 600
  • Inscrit(e) : 24-mars 05
  • Lieu:Fontainebleau ou Paris

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


implémentés comme suit:

Color.cpp
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_R*rhs,
				m_G*rhs,
				m_B*rhs,
				m_A*rhs);
}

et je les utilise dans une autre classe comme ceci:

Texture.cpp
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;
}


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:
  • 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
  • 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


Pourquoi il ne prend pas mes opérateurs?

EDIT: ajout extrait Color.cpp

Ce message a été modifié par Berzehk - 27 octobre 2009 - 21:15.

Image IPB Donnez la puissance inutilisée de votre bête de course pour la recherche

Posté 27 octobre 2009 - 21:00 (#2) L'utilisateur est hors-ligne   AnA-l 

  • Tullius Detritus
  • PipPipPipPipPipPipPip
  • Voir la galerie
  • Groupe : Membre
  • Messages : 5494
  • Inscrit(e) : 02-mars 06
  • Lieu:Rbx

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

Posté 27 octobre 2009 - 21:14 (#3) L'utilisateur est hors-ligne   Berzehk 

  • Lord Jedi Geek
  • PipPipPipPip
  • Groupe : Membre
  • Messages : 600
  • Inscrit(e) : 24-mars 05
  • Lieu:Fontainebleau ou Paris

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=)

Ce message a été modifié par Berzehk - 27 octobre 2009 - 21:15.

Image IPB Donnez la puissance inutilisée de votre bête de course pour la recherche

Posté 27 octobre 2009 - 22:11 (#4) L'utilisateur est hors-ligne   Doc Toise 

  • Padawan Geek
  • PipPip
  • Groupe : Membre
  • Messages : 82
  • Inscrit(e) : 19-septembre 05
  • Lieu:Chuiche

Voir le messageBerzehk, le 27/10/2009, 21:14, dit :

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.

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.

Posté 27 octobre 2009 - 22:52 (#5) L'utilisateur est hors-ligne   AnA-l 

  • Tullius Detritus
  • PipPipPipPipPipPipPip
  • Voir la galerie
  • Groupe : Membre
  • Messages : 5494
  • Inscrit(e) : 02-mars 06
  • Lieu:Rbx

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.

Posté 29 octobre 2009 - 20:42 (#6) L'utilisateur est hors-ligne   c0unt0 

  • Build succeeded !
  • PipPipPipPip
  • Groupe : Modérateurs
  • Messages : 984
  • Inscrit(e) : 02-avril 02

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 :D
Par contre, ca:
    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;


C'est super cracra!
c0unt0
Hey, nice marmot!

Posté 29 octobre 2009 - 22:14 (#7) L'utilisateur est hors-ligne   Berzehk 

  • Lord Jedi Geek
  • PipPipPipPip
  • Groupe : Membre
  • Messages : 600
  • Inscrit(e) : 24-mars 05
  • Lieu:Fontainebleau ou Paris

pas mon code :D 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é :D


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.
Image IPB Donnez la puissance inutilisée de votre bête de course pour la recherche

Partager ce sujet :


Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

1 utilisateur(s) en train de lire ce sujet
0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)


IPB Skins by Skinbox

Enter your sign in name and password


Sign in options
Log in with Facebook Log in with Twitter   Or sign in with these services