Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 19/06/2014, à 20:42

Crone123

[Résolu] C++: Impossible de faire une template...

Bonjour,
Depuis le début de l'après midi, j'essaie de faire une template qui marche.... en vain...


J'ai une classe principale, et j'ai besoin qu'une fonction de cette classe puisse accepter a peu près n'importe quel type d'objet.

En fait, je m'étais codé un petit moteur de particules, et pour créer de nouveaux types de particules, je crée une classe fille de ma classe particule, qui est fonctionnelle avec le moteur (ma classe principale)
J'ai une fonction "addParticle" qui sert a ajouter des particules dans mon moteur.

Sauf que, pour des raisons pratiques, j'aurais voulu ajouter tout un tableau de particules d'un coup.
Donc j'avais crée la même fonction, sauf que j'avais mis un std::vector<Particle*>& en type du paramètre.
L'idée est donc de passer un tableau de pointeurs de particules, sans copier le tableau que je passe en paramètre (utiliser une référence)

Sauf que ça a complètement foiré, et pour je sais pas quelle raison, supposons que j'ai une classe P, qui soit une classe fille de Particle, hé ben a la compilation, je ne pouvais pas mettre un std::vector<P*> en paramètre, ça marchait pas.

Dans une autre de mes fonctions, j'avais aussi besoin de créer directement dans ma fonction des objets du type personnalisé, que j'alloue dynamiquement. Donc je suis venu aux templates, en me disant que ça pourrait résoudre mon problème.

Mais voilà, après avoir passé des heures a comprendre comment ça marche, et comment l'utiliser sans que ça fasse n'importe quoi, je tombe toujours sur la même erreur:

main2.o: dans la fonction « MainWin::onUpdate() »:
main2.cpp:(.text._ZN7MainWin8onUpdateEv[_ZN7MainWin8onUpdateEv]+0x188): référence indéfinie vers « void sp::Engine::genQuads<sp::Particle*>(std::vector<sp::Particle*, std::allocator<sp::Particle*> >&, sf::Vector2<float>, sf::Vector2<float>, sf::Vector2<float>, sf::Color, unsigned int) »
main2.cpp:(.text._ZN7MainWin8onUpdateEv[_ZN7MainWin8onUpdateEv]+0x1ae): référence indéfinie vers « void sp::Engine::addTable<sp::Particle*>(std::vector<sp::Particle*, std::allocator<sp::Particle*> >&, std::string const&) »

Mon moteur de particules se compile correctement, en .a et en .so, et pour le programme qui l'utilise, j'ai choisi d'utiliser le .a, dans le doute j'ai aussi essayé de linker avec le .so, mais j'ai al même erreur, donc ça semble être une erreur venant de je sais pas où.

Donc, je résume mon code:
Dans mon .h, j'ai:

namespace sp
{
class Engine
{
public:
//beaucoup de code et fonctions
template<class ParticleType>
        void genQuads(std::vector<ParticleType>& table, const sf::Vector2f position = sf::Vector2f(0, 0), const sf::Vector2f size = sf::Vector2f(0, 0), const sf::Vector2f movement = sf::Vector2f(0, 0), const sf::Color color = sf::Color(255, 255, 255, 255), const unsigned int lifeTime = 1);
private:
//encore du code
};
}
//toujours du code

Et dans le .cpp:

//du code, du code
template<typename ParticleType>
void Engine::genQuads(std::vector<ParticleType>& table, const sf::Vector2f position, const sf::Vector2f size, const sf::Vector2f movement, const sf::Color color, const unsigned int lifeTime)
{
	ParticleType *np;
	np = new ParticleType;
//encore du code
}
//toujours du code

Voici ma commande pour compiler le .a et .so:

INCLUDE=-ISFML-2.1/include
LINK=-LSFML-2.1/lib -lsfml-graphics -lsfml-window -lsfml-system
Engine.o: Engine.h Engine.cpp
	g++ -c -fPIC -W -O6  $(INCLUDE) Engine.cpp -o Engine.o $(LINK)
libsp.so: Engine.o
	g++ $(ARG) -fPIC -shared Engine.o -o libsp.so
libsp.a: Engine.o
	ar r libsp.a Engine.o
	ranlib libsp.a

Et pour mon programme de test:

test: libsp.a main2.o
	g++ -W -O6 $(INCLUDE) main2.o libsp.a -o test $(LINK) -lGL

Donc, ça compile correctement, pas d'erreur dans mes .cpp et .h, sauf ce que j'ai mis au dessus pour un programme de test qui utilise ma bibliothèque....et uniquement si j'appelle les fonctions template, toutes les autres fonctions peuvent être appelées correctement depuis le programme de test sinon.

Ma déclaration de la template est t-elle correcte?
Quelqu'un sait t-il où ça peut coincer?
Merci d'avance smile

Dernière modification par Crone123 (Le 23/06/2014, à 18:04)

Hors ligne

#2 Le 22/06/2014, à 10:38

alius

Re : [Résolu] C++: Impossible de faire une template...

Apparemment il ne trouve pas ta fonction genQuads lorsque tu y fais un appel dans ton main.cpp

dans le code que tu utilise pour compiler tu ne fais nul part référence au main.o ! le linkage ne peut pas se faire, d'où le indefened reference


Alius

Hors ligne

#3 Le 22/06/2014, à 12:59

Crone123

Re : [Résolu] C++: Impossible de faire une template...

Sauf que le main.o ne contient pas ça.

Depuis le temps que j'ai posté, j'ai fini par trouver.
Si vous voulez la réponse:

Déjà, il fallait déclarer intégralement les fonctions dans mon .h et pas dans le .cpp. (Ce qui est complètement débile, pourquoi n'ont t-ils pas implémenté le truc entièrement ? yikes )

Ensuite, pour la fonction genQuads, il fallait utiliser 2 types génériques pour que ça marche (celui du tableau, et celui de la particule), et pour les autres fonctions 1 seul.
J'ai trouvé ça après de longues recherches quelques heures après avoir posté ce message.
Bref, actuellement ça marche a merveille smile

Hors ligne

#4 Le 23/06/2014, à 11:06

Luc Hermitte

Re : [Résolu] C++: Impossible de faire une template...

Réponse dans la FAQ C++ de dvpz (et à peu près toutes les autres en fait tongue)
http://cpp.developpez.com/faq/cpp/?page … -des-liens

Hors ligne

#5 Le 23/06/2014, à 18:04

Crone123

Re : [Résolu] C++: Impossible de faire une template...

C'est de là que j'ai trouvé en partie ma solution smile

Hors ligne