Aller au contenu

Change
Bienvenue sur GeekZone
Inscrivez-vous sur GeekZone pour profiter des fonctions avancées du forum, proposer des news, participer aux conversations, ouvrir votre galerie, profiter de la messagerie interne et venir tester nos modérateurs avec du bon troll... Attention, ils ont la gâchette facile. C’est aussi pour ça que GeekZone est le meilleur site de passionnés depuis 2002 ! Si vous avez déjà un compte, connectez-vous - sinon, il est temps d'en créer un.

[RESOLU][C++] Unresolved symbols

- - - - -

6 réponses à ce sujet

#1
Berzehk

    Lord Jedi Geek

  • Membre
  • PipPipPipPip
  • 941 messages
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

Modifié par Berzehk, 27 October 2009 - 21:15.

Comes in two flavors: M197 and 2A42.

#2
AnA-l

    Monde de merde !

  • Membre
  • PipPipPipPipPipPipPip
  • 6937 messages
  • Lieu:Rbx
inline et const c'est pas incompatible ? Sans l'un ou l'autre ca passe pas mieux ?

#3
Berzehk

    Lord Jedi Geek

  • Membre
  • PipPipPipPip
  • 941 messages
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=)

Modifié par Berzehk, 27 October 2009 - 21:15.

Comes in two flavors: M197 and 2A42.

#4
Doc Toise

    Padawan Geek

  • Membre
  • PipPip
  • 82 messages
  • 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.

#5
AnA-l

    Monde de merde !

  • Membre
  • PipPipPipPipPipPipPip
  • 6937 messages
  • 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.

#6
c0unt0

    Build succeeded !

  • Modérateurs
  • PipPipPipPip
  • 984 messages
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!

#7
Berzehk

    Lord Jedi Geek

  • Membre
  • PipPipPipPip
  • 941 messages
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.
Comes in two flavors: M197 and 2A42.





1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)