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 07/06/2013, à 16:49

grigouille

[Résolu] c++ template : Problème de compilation

Bonjour,

J'essaie d'écrire une class Vector dans le style de la nouvelle classe array de <array>.
J'essaie aussi d'appliquer la technique d'addition sans temporaire que l'on peut trouver dans "The C++ Programming Language" de Stroustrup §22.4.7.

Problème, avec la version template

cout << u+v

ne compile pas alors qu'une conversion implicite devrait se faire.
La version sans template (vecteur de double de taille 3) fonctionne parfaitement. Pourquoi ?

Si quelqu'un pouvait m'expliquer. Merci.

Version sans template :

#ifndef VectorLib_h
#define VectorLib_h
 
#include <iostream>
#include<algorithm>
using namespace std;


typedef size_t Index;


class Vector;
void add(Vector& res, const Vector& a, const Vector& b);
/** ABadd */
struct ABadd {
	const Vector& a;
	const Vector& b;
	ABadd(const Vector& aa, const Vector& bb) : a(aa), b(bb){}
	//operator Vector() const {Vector res;add(res, a, b);return res;}	
};

/**
	\class Vector
*/


class Vector {
protected:
	/** Support for zero-sized arrays mandatory */
	double elem[3 ? 3 : 1];
public:
	typedef double			value_type;
	typedef double*			pointer;
	typedef const double*	const_pointer;
	typedef value_type&			reference;
	typedef const value_type&	const_reference;
	typedef value_type*			iterator;
	typedef const value_type*	const_iterator;
	typedef Index				size_type;
	
	/** Iterators */
	iterator begin() {return &(elem[0]);}
	const_iterator begin() const {return &(elem[0]);}

	iterator end() {return begin() + 3;}
	const_iterator end() const {return begin() + 3;}
	
	/** Element access */
	reference operator()(const Index i) {return elem[i];}
	const_reference operator()(const Index i) const {return elem[i];}
		
	/** Capacity */
	size_type size() const {return 3;}
	/** destructor */
	~Vector(){}

	/** constructor */
	Vector(const double& a = double()) {for(Index i = 0 ; i < size() ; ++i) elem[i] = a;}	
	Vector(const Vector& a) {copy(a.begin(), a.end(), begin());}
	Vector(const ABadd& a) {add(*this, a.a, a.b);}

	/** assignment */
	Vector& operator=(const Vector& a) {if(&a != this) copy(a.begin(), a.end(), begin());return *this;}
	Vector& operator=(const ABadd& a){add(*this, a.a, a.b);return *this;}
};
 
const char sep1 = '(';
const char sep2 = ')';

/** operator<< */
inline
std::ostream& operator<<(std::ostream& os, const Vector& a) {
	os << sep1;
	for(Index i = 0 ; i < a.size() ; ++i) os << a(i) << ' ';	
	return os << sep2;
}

/** add */
inline
void add(Vector& res, const Vector& a, const Vector& b) {for(Index i = 0 ; i < a.size() ; ++i) res(i) = a(i)+b(i);}



inline
ABadd operator+(const Vector& a, const Vector& b) {return ABadd(a,b);}

int main() {
	Vector v;
	v(0) = 7;
	v(1)=-1;
	v(2)=4;
	Vector w;
	w(0) = 2;
	w(1) = 1;
	w(2) = -3;
	cout << "w " << w << endl
	<< "v " << v << endl << "w+v\n";
	//cout  << static_cast<Vector<double,3> >(w+v);
//	w = w + v;
	cout  << w+v;
	//cout  << typeid(w+v).name();
	cout << endl;
	return 0;
}


 #endif //VectorLib_h

Version avec template :

#ifndef VectorLib_h
#define VectorLib_h
 
#include<algorithm>
#include <iostream>
using namespace std;


typedef size_t Index;


template<class T, Index N> class Vector;
template<class T, Index N> void add(Vector<T,N>& res, const Vector<T,N>& a, const Vector<T,N>& b);
/** ABadd */
template<class T, Index N> struct ABadd {
	const Vector<T,N>& a;
	const Vector<T,N>& b;
	ABadd(const Vector<T,N>& aa, const Vector<T,N>& bb) : a(aa), b(bb){}
	//operator Vector<T,N>() const {Vector<T,N> res;add(res, a, b);return res;}	
};


/**
	\class Vector
	\brief A standard container for storing a fixed size sequence of elements.
	Sets support random access iterators.
	I could have derived it from STL array
	
	\param T Type of element. Required to be a complete type.
	\param N Number of elements.
*/

template<class T, Index N>
class Vector {
protected:
	/** Support for zero-sized arrays mandatory */
	T elem[N ? N : 1];
public:
	typedef T			value_type;
	typedef T*			pointer;
	typedef const T*	const_pointer;
	typedef value_type&			reference;
	typedef const value_type&	const_reference;
	typedef value_type*			iterator;
	typedef const value_type*	const_iterator;
	typedef Index				size_type;
	
	/** Iterators */
	iterator begin() {return &(elem[0]);}
	const_iterator begin() const {return &(elem[0]);}

	iterator end() {return begin() + N;}
	const_iterator end() const {return begin() + N;}
	
	/** Element access */
	reference operator()(const Index i) {return elem[i];}
	const_reference operator()(const Index i) const {return elem[i];}
	
	/** Capacity */
	size_type size() const {return N;}
	/** destructor */
	~Vector(){}

	/** constructor */
	Vector(const T& a = T()) {for(Index i = 0 ; i < size() ; ++i) elem[i] = a;}	
	Vector(const Vector<T,N>& a) {copy(a.begin(), a.end(), begin());}
	Vector(const ABadd<T,N>& a) {add(*this, a.a, a.b);}

	/** assignment */
	Vector& operator=(const Vector<T,N>& a) {if(&a != this) copy(a.begin(), a.end(), begin());return *this;}
	Vector& operator=(const ABadd<T,N>& a){add(*this, a.a, a.b);return *this;}
};
 
const char sep1 = '(';
const char sep2 = ')';

/** operator<< */
template<class T, Index N> inline
std::ostream& operator<<(std::ostream& os, const Vector<T,N>& a) {
	os << sep1;
	for(Index i = 0 ; i < a.size() ; ++i) os << a(i) << ' ';	
	return os << sep2;
}

/** add */
template<class T, Index N> inline
void add(Vector<T,N>& res, const Vector<T,N>& a, const Vector<T,N>& b) {for(Index i = 0 ; i < a.size() ; ++i) res(i) = a(i)+b(i);}


template<class T, Index N> inline
ABadd<T,N> operator+(const Vector<T,N>& a, const Vector<T,N>& b) {return ABadd<T,N>(a,b);}


int main() {
	Vector<double,3> v;
	v(0) = 7;
	v(1)=-1;
	v(2)=4;
	Vector<double,3> w;
	w(0) = 2;
	w(1) = 1;
	w(2) = -3;
	cout << "w " << w << endl
	<< "v " << v << endl << "w+v\n";
	//cout  << static_cast<Vector<double,3> >(w+v);
//	w = w + v;
	cout  << w+v;
	//cout  << typeid(w+v).name();
	cout << endl;
	return 0;
}

 #endif //VectorLib_h

Dernière modification par grigouille (Le 07/06/2013, à 22:54)


Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne

#2 Le 07/06/2013, à 16:59

telliam

Re : [Résolu] c++ template : Problème de compilation

c'est quoi la trace d'erreur du compilo?


"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard

Hors ligne

#3 Le 07/06/2013, à 17:04

grigouille

Re : [Résolu] c++ template : Problème de compilation

Merci de t'intéresser à ce problème. Voici le retour du compilo :

$ g++ -o vector  -Wall Vector.cpp
Vector.cpp: In function ‘int main()’:
Vector.cpp:107:13: erreur: no match for ‘operator<<’ in ‘std::cout << operator+ [with T = double, long unsigned int N = 3ul]((*(const Vector<double, 3ul>*)(& w)), (*(const Vector<double, 3ul>*)(& v)))’
Vector.cpp:107:13: note: candidates are:
/usr/include/c++/4.6/ostream:110:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>::__ostream_type& (*)(std::basic_ostream<_CharT, _Traits>::__ostream_type&)) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]
/usr/include/c++/4.6/ostream:110:7: note:   no known conversion for argument 1 from ‘ABadd<double, 3ul>’ to ‘std::basic_ostream<char>::__ostream_type& (*)(std::basic_ostream<char>::__ostream_type&) {aka std::basic_ostream<char>& (*)(std::basic_ostream<char>&)}’
/usr/include/c++/4.6/ostream:119:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>::__ios_type& (*)(std::basic_ostream<_CharT, _Traits>::__ios_type&)) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>, std::basic_ostream<_CharT, _Traits>::__ios_type = std::basic_ios<char>]
/usr/include/c++/4.6/ostream:119:7: note:   no known conversion for argument 1 from ‘ABadd<double, 3ul>’ to ‘std::basic_ostream<char>::__ios_type& (*)(std::basic_ostream<char>::__ios_type&) {aka std::basic_ios<char>& (*)(std::basic_ios<char>&)}’
/usr/include/c++/4.6/ostream:129:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(std::ios_base& (*)(std::ios_base&)) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]
/usr/include/c++/4.6/ostream:129:7: note:   no known conversion for argument 1 from ‘ABadd<double, 3ul>’ to ‘std::ios_base& (*)(std::ios_base&)’
/usr/include/c++/4.6/ostream:167:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(long int) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]
/usr/include/c++/4.6/ostream:167:7: note:   no known conversion for argument 1 from ‘ABadd<double, 3ul>’ to ‘long int’
/usr/include/c++/4.6/ostream:171:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]
/usr/include/c++/4.6/ostream:171:7: note:   no known conversion for argument 1 from ‘ABadd<double, 3ul>’ to ‘long unsigned int’
/usr/include/c++/4.6/ostream:175:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(bool) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]
/usr/include/c++/4.6/ostream:175:7: note:   no known conversion for argument 1 from ‘ABadd<double, 3ul>’ to ‘bool’
/usr/include/c++/4.6/bits/ostream.tcc:93:5: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.6/bits/ostream.tcc:93:5: note:   no known conversion for argument 1 from ‘ABadd<double, 3ul>’ to ‘short int’
/usr/include/c++/4.6/ostream:182:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(short unsigned int) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]
/usr/include/c++/4.6/ostream:182:7: note:   no known conversion for argument 1 from ‘ABadd<double, 3ul>’ to ‘short unsigned int’
/usr/include/c++/4.6/bits/ostream.tcc:107:5: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.6/bits/ostream.tcc:107:5: note:   no known conversion for argument 1 from ‘ABadd<double, 3ul>’ to ‘int’
/usr/include/c++/4.6/ostream:193:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(unsigned int) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]
/usr/include/c++/4.6/ostream:193:7: note:   no known conversion for argument 1 from ‘ABadd<double, 3ul>’ to ‘unsigned int’
/usr/include/c++/4.6/ostream:202:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(long long int) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]
/usr/include/c++/4.6/ostream:202:7: note:   no known conversion for argument 1 from ‘ABadd<double, 3ul>’ to ‘long long int’
/usr/include/c++/4.6/ostream:206:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(long long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]
/usr/include/c++/4.6/ostream:206:7: note:   no known conversion for argument 1 from ‘ABadd<double, 3ul>’ to ‘long long unsigned int’
/usr/include/c++/4.6/ostream:211:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(double) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]
/usr/include/c++/4.6/ostream:211:7: note:   no known conversion for argument 1 from ‘ABadd<double, 3ul>’ to ‘double’
/usr/include/c++/4.6/ostream:215:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(float) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]
/usr/include/c++/4.6/ostream:215:7: note:   no known conversion for argument 1 from ‘ABadd<double, 3ul>’ to ‘float’
/usr/include/c++/4.6/ostream:223:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(long double) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]
/usr/include/c++/4.6/ostream:223:7: note:   no known conversion for argument 1 from ‘ABadd<double, 3ul>’ to ‘long double’
/usr/include/c++/4.6/ostream:227:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(const void*) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]
/usr/include/c++/4.6/ostream:227:7: note:   no known conversion for argument 1 from ‘ABadd<double, 3ul>’ to ‘const void*’
/usr/include/c++/4.6/bits/ostream.tcc:121:5: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>::__streambuf_type*) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_ostream<_CharT, _Traits>::__streambuf_type = std::basic_streambuf<char>]
/usr/include/c++/4.6/bits/ostream.tcc:121:5: note:   no known conversion for argument 1 from ‘ABadd<double, 3ul>’ to ‘std::basic_ostream<char>::__streambuf_type* {aka std::basic_streambuf<char>*}’
Vector.cpp:79:15: note: template<class T, long unsigned int N> std::ostream& operator<<(std::ostream&, const Vector<T, N>&)
/usr/include/c++/4.6/ostream:528:5: note: template<class _Traits> std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, const unsigned char*)
/usr/include/c++/4.6/ostream:523:5: note: template<class _Traits> std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, const signed char*)
/usr/include/c++/4.6/ostream:510:5: note: template<class _Traits> std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, const char*)
/usr/include/c++/4.6/bits/ostream.tcc:323:5: note: template<class _CharT, class _Traits> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, const char*)
/usr/include/c++/4.6/ostream:493:5: note: template<class _CharT, class _Traits> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, const _CharT*)
/usr/include/c++/4.6/ostream:473:5: note: template<class _Traits> std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, unsigned char)
/usr/include/c++/4.6/ostream:468:5: note: template<class _Traits> std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, signed char)
/usr/include/c++/4.6/ostream:462:5: note: template<class _Traits> std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, char)
/usr/include/c++/4.6/ostream:456:5: note: template<class _CharT, class _Traits> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, char)
/usr/include/c++/4.6/ostream:451:5: note: template<class _CharT, class _Traits> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, _CharT)
/usr/include/c++/4.6/bits/basic_string.h:2693:5: note: template<class _CharT, class _Traits, class _Alloc> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, const std::basic_string<_CharT, _Traits, _Alloc>&)

Je remets le code pour être sûr :

#ifndef VectorLib_h
#define VectorLib_h
 
#include<algorithm>
#include <iostream>
using namespace std;


typedef size_t Index;


template<class T, Index N> class Vector;
template<class T, Index N> void add(Vector<T,N>& res, const Vector<T,N>& a, const Vector<T,N>& b);
/** ABadd */
template<class T, Index N> struct ABadd {
	const Vector<T,N>& a;
	const Vector<T,N>& b;
	ABadd(const Vector<T,N>& aa, const Vector<T,N>& bb) : a(aa), b(bb){}
	//operator Vector<T,N>() const {Vector<T,N> res;add(res, a, b);return res;}	
};


/**
	\class Vector
	\brief A standard container for storing a fixed size sequence of elements.
	Sets support random access iterators.
	I could have derived it from STL array
	
	\param T Type of element. Required to be a complete type.
	\param N Number of elements.
*/

template<class T, Index N>
class Vector {
protected:
	/** Support for zero-sized arrays mandatory */
	T elem[N ? N : 1];
public:
	typedef T			value_type;
	typedef T*			pointer;
	typedef const T*	const_pointer;
	typedef value_type&			reference;
	typedef const value_type&	const_reference;
	typedef value_type*			iterator;
	typedef const value_type*	const_iterator;
	typedef Index				size_type;
	
	/** Iterators */
	iterator begin() {return &(elem[0]);}
	const_iterator begin() const {return &(elem[0]);}

	iterator end() {return begin() + N;}
	const_iterator end() const {return begin() + N;}
	
	/** Element access */
	reference operator()(const Index i) {return elem[i];}
	const_reference operator()(const Index i) const {return elem[i];}
	
	/** Capacity */
	size_type size() const {return N;}
	/** destructor */
	~Vector(){}

	/** constructor */
	Vector(const T& a = T()) {for(Index i = 0 ; i < size() ; ++i) elem[i] = a;}	
	Vector(const Vector<T,N>& a) {copy(a.begin(), a.end(), begin());}
	Vector(const ABadd<T,N>& a) {add(*this, a.a, a.b);}

	/** assignment */
	Vector& operator=(const Vector<T,N>& a) {if(&a != this) copy(a.begin(), a.end(), begin());return *this;}
	Vector& operator=(const ABadd<T,N>& a){add(*this, a.a, a.b);return *this;}
};
 
const char sep1 = '(';
const char sep2 = ')';

/** operator<< */
template<class T, Index N> inline
std::ostream& operator<<(std::ostream& os, const Vector<T,N>& a) {
	os << sep1;
	for(Index i = 0 ; i < a.size() ; ++i) os << a(i) << ' ';	
	return os << sep2;
}

/** add */
template<class T, Index N> inline
void add(Vector<T,N>& res, const Vector<T,N>& a, const Vector<T,N>& b) {for(Index i = 0 ; i < a.size() ; ++i) res(i) = a(i)+b(i);}


template<class T, Index N> inline
ABadd<T,N> operator+(const Vector<T,N>& a, const Vector<T,N>& b) {return ABadd<T,N>(a,b);}


int main() {
	Vector<double,3> v;
	v(0) = 7;
	v(1)=-1;
	v(2)=4;
	Vector<double,3> w;
	w(0) = 2;
	w(1) = 1;
	w(2) = -3;
	cout << "w " << w << endl
	<< "v " << v << endl << "w+v\n";
	//cout  << static_cast<Vector<double,3> >(w+v);
//	w = w + v;
	cout  << w+v;
	//cout  << typeid(w+v).name();
	cout << endl;
	return 0;
}

 #endif //VectorLib_h

Je ne comprends pas pourquoi il ne fait pas la conversion implicite. Aucun souci si on enlève les templates.

Dernière modification par grigouille (Le 07/06/2013, à 17:06)


Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne

#4 Le 07/06/2013, à 20:59

grim7reaper

Re : [Résolu] c++ template : Problème de compilation

Salut,

grigouille a écrit :

Je ne comprends pas pourquoi il ne fait pas la conversion implicite. Aucun souci si on enlève les templates.

Regarde ce fil, si je ne dis pas de bêtises c’est pile poil la situation dans laquelle tu te trouves.

Johan Lundberg a écrit :

The reason it does not work is that implicit type conversions (via constructors) do not apply during template argument deduction.

brendanw a écrit :

The compile error you get in the template case is due to the fact that template argument deduction runs before overload resolution, and template argument deduction needs exact matches to add anything to the overload set.

Donc le static_cast explicite passe sans problème, pour l’implicite c’est moins simple.

Dernière modification par grim7reaper (Le 07/06/2013, à 21:01)

Hors ligne

#5 Le 07/06/2013, à 22:57

grigouille

Re : [Résolu] c++ template : Problème de compilation

Merci beaucoup grim7reaper pour avoir mis la main sur ce fil !

Avec les template, il faut décidément s'attendre à des grosses surprises.

Bonne compilation à tous.

Dernière modification par grigouille (Le 07/06/2013, à 22:58)


Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne