OVH Cloud OVH Cloud

Problème de type dépendant ?

4 réponses
Avatar
Manuel Zaccaria
Bonsoir à tous,


Je sèche.... j'essaie de comprendre pourquoi dans :



// (exemple simplifié)

template<int I, int J, class T = float>
struct Matrix
{
// ...

T mat[I][J];
};

//...
typedef Matrix<1,4,float> vec4;
// ...
typedef Matrix<4,4,float> mat4x4;
// ...

template<int I, int J, int K, class T>
struct MatrixProduct
{
MatrixProduct(Matrix<I,J,T> const& m1,
Matrix<K,J,T> const& m2);

// matrix*matrix product
operator Matrix<I,K,T>() const;
};

template<int J, class T>
struct MatrixProduct<1,J,1,T>
{
MatrixProduct(Matrix<1,J,T> const& m1,
Matrix<1,J,T> const& m2);

// vector product
operator Matrix<1,J,T>() const;

// T scalar product
operator T() const;
};

// Implémentation (hors-propos) omise
// ...

template<int I, int J, int K, class T>
MatrixProduct<I,J,K,T> operator*(Matrix<I,J,T> const& m1,
Matrix<K,J,T> const& m2)
{
return MatrixProduct<I,J,K,T>(m1, m2);
}


int main()
{
mat4x4 mat;
vec4 v1;

// ...

vec4 v2 = v1 * mat;
vec4 cross = v1 * v2;
float dot = v1 * v2;

return 0;
}


Le compilo (VC2005-CL14) m'insulte avec :

MatrixProduct<I,J,K> operator *(const Matrix<I,J> &, const Matrix<K,J> &) :
could not deduce template argument for 'const Matrix<K,J> &' from 'vec4'

...pour les trois produits.

Je ne vois pas pourquoi il ne peut pas déduire le second argument de * ??
Je serais mille fois reconnaîssant si quelqu'un pouvait m'éclairer ici.


Confu,
Manuel

4 réponses

Avatar
Fabien LE LEZ
On Thu, 27 Jul 2006 21:21:59 +0200, "Manuel Zaccaria"
:

Le compilo (VC2005-CL14) m'insulte avec :


Comeau et g++ 4.0.2 acceptent ce code sans broncher.

Avatar
Manuel Zaccaria
Fabien LE LEZ a écrit:
Le compilo (VC2005-CL14) m'insulte avec :


Comeau et g++ 4.0.2 acceptent ce code sans broncher.


Merci Fabien. C'est bien ce que je soupçonnais...
maudit soit MS!!! Ca marche très bien avec :

template<int I, int J, class T>
VectorProduct<I,J,T> operator*(Vector<I,T> const& v1,
Vector<J,T> const& v2)
{
return VectorProduct<I,J,T>(v1, v2);
}

Et il suffit d'un paramètre en plus pour le mettre à genou :(

Quelqu'un voit un moyen de contourner ce mur ?


Enervé,
Manuel


Avatar
kanze
Manuel Zaccaria wrote:

Je sèche.... j'essaie de comprendre pourquoi dans :

// (exemple simplifié)

template<int I, int J, class T = float>
struct Matrix
{
// ...

T mat[I][J];
};

//...
typedef Matrix<1,4,float> vec4;
// ...
typedef Matrix<4,4,float> mat4x4;
// ...

template<int I, int J, int K, class T>
struct MatrixProduct
{
MatrixProduct(Matrix<I,J,T> const& m1,
Matrix<K,J,T> const& m2);

// matrix*matrix product
operator Matrix<I,K,T>() const;
};

template<int J, class T>
struct MatrixProduct<1,J,1,T>
{
MatrixProduct(Matrix<1,J,T> const& m1,
Matrix<1,J,T> const& m2);
// vector product
operator Matrix<1,J,T>() const;
// T scalar product
operator T() const;
};

// Implémentation (hors-propos) omise
// ...

template<int I, int J, int K, class T>
MatrixProduct<I,J,K,T> operator*(Matrix<I,J,T> const& m1,
Matrix<K,J,T> const& m2)
{
return MatrixProduct<I,J,K,T>(m1, m2);
}

int main()
{
mat4x4 mat;
vec4 v1;

// ...

vec4 v2 = v1 * mat;
vec4 cross = v1 * v2;
float dot = v1 * v2;

return 0;
}

Le compilo (VC2005-CL14) m'insulte avec :

MatrixProduct<I,J,K> operator *(const Matrix<I,J> &, const Matrix<K,J> &) :
could not deduce template argument for 'const Matrix<K,J> &' from 'vec4'

...pour les trois produits.


En es-tu sûr ? Je ne l'ai pas essayé (il faut que j'ailles à
une autre machine pour essayer VC++), mais a priori, je me pose
la question parce que le message d'erreur parle des « const
Matrix<I,J> », et non des « const Matrix<I,J,T> ». Ce qui
laisse penser que tu as en fait compiler avec une version
incompatible de la déclaration de l'opérateur, où T n'était pas
un paramètre du template.

Je ne vois pas pourquoi il ne peut pas déduire le second
argument de * ??


D'après le message d'erreur, le compilateur voit un operator*
avec comme paramètre des Matrix<I,J>.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Avatar
Manuel Zaccaria
kanze a écrit:

[...]

MatrixProduct<I,J,K> operator *(const Matrix<I,J> &, const Matrix<K,J> &)
:
could not deduce template argument for 'const Matrix<K,J> &' from 'vec4'


En es-tu sûr ? Je ne l'ai pas essayé (il faut que j'ailles à
une autre machine pour essayer VC++), mais a priori, je me pose
la question parce que le message d'erreur parle des « const
Matrix<I,J> », et non des « const Matrix<I,J,T> ». Ce qui


En effet, ça m'avait frappé et j'ai examiné et examiné et examiné mon
code...

laisse penser que tu as en fait compiler avec une version
incompatible de la déclaration de l'opérateur, où T n'était pas
un paramètre du template.

Je ne vois pas pourquoi il ne peut pas déduire le second
argument de * ??


D'après le message d'erreur, le compilateur voit un operator*
avec comme paramètre des Matrix<I,J>.


...sans voir ce qui me pendait littéralement au nez.

Merci James.


Manuel