OVH Cloud OVH Cloud

Specialisation de templates imbriques

9 réponses
Avatar
Marc Duflot
Bonjour.

Un collaborateur essaie de compiler avec Visual C++ du code que j'ai
écrit pour g++. Il est à l'étranger et je n'ai pas accès à dson
compilateur. Visual C++ refuse le code suivant qui compile avec Comeau
online et g++.

Pouvez-vous confirmer que le code est légal ? Quelqu'un d'expérimenté
avec Visual C++ peut-il me conseiller un workaround ?

Merci.
Marc


#include<vector>

template <int N>
class C {
public:
template <typename T1>
struct Trait1
{
typedef std::vector <T1> V;
};
typedef double T2;
template <typename T1>
typename Trait1<T1>::V f (const T1& t) const;
};

template<>
template<>
C<1>::Trait1<C<1>::T2>::V
C<1>::f (const T2& t) const
{
return Trait1<T2>::V();
}

int main()
{
C<1> e;
std::vector<double> v (e.f(1.0));
}

9 réponses

Avatar
Fabien LE LEZ
On Tue, 18 Oct 2005 17:55:52 +0200, Marc Duflot
:

Visual C++


Quelle version ?

Avatar
Marc Duflot
Fabien LE LEZ wrote:
On Tue, 18 Oct 2005 17:55:52 +0200, Marc Duflot
:


Visual C++



Quelle version ?


La version de 2003. Je ne connais pas l'intitulé officiel, mais c'est
celui qui comprend '2003'. Je pense que ça correspond au compilateur C++
7.1.

L'erreur concerne le type de retour qui n'est pas le même dans la
déclaration et la définition.


Avatar
Jean-Marc Bourguet
Marc Duflot writes:

Bonjour.

Un collaborateur essaie de compiler avec Visual C++ du code que j'ai écrit
pour g++. Il est à l'étranger et je n'ai pas accès à dson
compilateur. Visual C++ refuse le code suivant qui compile avec Comeau
online et g++.

Pouvez-vous confirmer que le code est légal ? Quelqu'un d'expérimenté avec
Visual C++ peut-il me conseiller un workaround ?


Je ne vois pas de probleme, mais je ne suis pas un champion non plus.
Quel est le message d'erreur de VC++?

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Marc Duflot
Jean-Marc Bourguet wrote:
Marc Duflot writes:


Bonjour.

Un collaborateur essaie de compiler avec Visual C++ du code que j'ai écrit
pour g++. Il est à l'étranger et je n'ai pas accès à dson
compilateur. Visual C++ refuse le code suivant qui compile avec Comeau
online et g++.

Pouvez-vous confirmer que le code est légal ? Quelqu'un d'expérimenté avec
Visual C++ peut-il me conseiller un workaround ?



Je ne vois pas de probleme, mais je ne suis pas un champion non plus.
Quel est le message d'erreur de VC++?


'unable to match function definition to an existing declaration' puis le
compilateur donne la définition et la déclaration. Il ne comprend pas
qu'il y a accord entre les types donnés à la spécialisation et ceux à la
déclaration du template.


Avatar
Jean-Marc Bourguet
Marc Duflot writes:

Jean-Marc Bourguet wrote:
Marc Duflot writes:

Bonjour.

Un collaborateur essaie de compiler avec Visual C++ du code que j'ai écrit
pour g++. Il est à l'étranger et je n'ai pas accès à dson
compilateur. Visual C++ refuse le code suivant qui compile avec Comeau
online et g++.

Pouvez-vous confirmer que le code est légal ? Quelqu'un d'expérimenté avec
Visual C++ peut-il me conseiller un workaround ?
Je ne vois pas de probleme, mais je ne suis pas un champion non plus.

Quel est le message d'erreur de VC++?


'unable to match function definition to an existing declaration' puis le
compilateur donne la définition et la déclaration. Il ne comprend pas qu'il
y a accord entre les types donnés à la spécialisation et ceux à la
déclaration du template.


Est-ce que VC++ s'emelerait les pincaux avec le type de 1.0?
Un workaround possible:

std::vector<double> v (e.f<double>(1.0));

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org



Avatar
Jean-Marc Bourguet
Marc Duflot writes:

Jean-Marc Bourguet wrote:
Marc Duflot writes:

Bonjour.

Un collaborateur essaie de compiler avec Visual C++ du code que j'ai écrit
pour g++. Il est à l'étranger et je n'ai pas accès à dson
compilateur. Visual C++ refuse le code suivant qui compile avec Comeau
online et g++.

Pouvez-vous confirmer que le code est légal ? Quelqu'un d'expérimenté avec
Visual C++ peut-il me conseiller un workaround ?
Je ne vois pas de probleme, mais je ne suis pas un champion non plus.

Quel est le message d'erreur de VC++?


'unable to match function definition to an existing declaration' puis le
compilateur donne la définition et la déclaration. Il ne comprend pas qu'il
y a accord entre les types donnés à la spécialisation et ceux à la
déclaration du template.


Est-ce que VC++ s'emelerait les pincaux avec le type de 1.0?
Un workaround possible (je n'ai pas VC++):

std::vector<double> v (e.f<double>(1.0));

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org



Avatar
Marc Duflot
Jean-Marc Bourguet wrote:
Marc Duflot writes:


Jean-Marc Bourguet wrote:

Marc Duflot writes:


Bonjour.

Un collaborateur essaie de compiler avec Visual C++ du code que j'ai écrit
pour g++. Il est à l'étranger et je n'ai pas accès à dson
compilateur. Visual C++ refuse le code suivant qui compile avec Comeau
online et g++.

Pouvez-vous confirmer que le code est légal ? Quelqu'un d'expérimenté avec
Visual C++ peut-il me conseiller un workaround ?


Je ne vois pas de probleme, mais je ne suis pas un champion non plus.
Quel est le message d'erreur de VC++?


'unable to match function definition to an existing declaration' puis le
compilateur donne la définition et la déclaration. Il ne comprend pas qu'il
y a accord entre les types donnés à la spécialisation et ceux à la
déclaration du template.



Est-ce que VC++ s'emelerait les pincaux avec le type de 1.0?
Un workaround possible (je n'ai pas VC++):

std::vector<double> v (e.f<double>(1.0));


Merci mais ce n'est pas ça. L'erreur se produit avant l'appel à f, dès
la spécialisation. Voici un cas encore plus réduit, avec le message
d'erreur complet. Dans ce cas, il se plaint que les types de retour sont
différents alors qu'ils sont manifestement les mêmes dans le reste du
message d'erreur.


template <class T1, class T2>
struct Trait
{
typedef T1 type;
};

template <class T1>
struct C
{
template <class T2>
typename Trait<T1,T2>::type foo (T1,T2);
};

template<>
template<>
Trait<int,double>::type C<int>::foo(int,double)
{
return 0;
}

/////////////////

Microsoft (R) 32 bits C/C++ Version standard du compilateur 13.10.3077
pour 80x86
Copyright (C) Microsoft Corp 1984-2002. Tous droits réservés.

test-phong8.cxx
test-phong8.cxx(19) : error C2785: 'Trait<T1,T1>::type
C<T1>::foo(T1,T2)' et 'Trait<T1,T2>::type C<T1>::foo(int,double)'
ont des types de retour différents
with
[
T1=int
]
and
[
T1=int,
T2=double
]
test-phong8.cxx(11) : voir la déclaration de 'C<T1>::foo'
with
[
T1=int
]
test-phong8.cxx(16) : voir la déclaration de 'C<T1>::foo'
with
[
T1=int
]
test-phong8.cxx(19) : error C2910: 'foo' : ne peut pas être
explicitement spécialisé

/////////////////

Si le Trait ne dépend pas de T2, ça passe. (Dans le cas réel, type
dépend de T2, bien entendu.)




Avatar
Jean-Marc Bourguet
Marc Duflot writes:

template <class T1, class T2>
struct Trait
{
typedef T1 type;
};

template <class T1>
struct C
{
template <class T2>
typename Trait<T1,T2>::type foo (T1,T2);
};

template<>
template<>
Trait<int,double>::type C<int>::foo(int,double)
{
return 0;
}


Et en faisant quelque chose comme (note que ca devient de la
programmation genetique et j'aime pas trop ca).

template<>
struct C<int>
{
template <class T2>
typename Trait<int,T2>::type foo(int, T2);
};

template<>
Trait<int,double>::type C<int>::foo<double>(int,double)
{
return 0;
}

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Marc Duflot
Jean-Marc Bourguet wrote:
Marc Duflot writes:


template <class T1, class T2>
struct Trait
{
typedef T1 type;
};

template <class T1>
struct C
{
template <class T2>
typename Trait<T1,T2>::type foo (T1,T2);
};

template<>
template<>
Trait<int,double>::type C<int>::foo(int,double)
{
return 0;
}



Et en faisant quelque chose comme (note que ca devient de la
programmation genetique et j'aime pas trop ca).

template<>
struct C<int>
{
template <class T2>
typename Trait<int,T2>::type foo(int, T2);
};

template<>
Trait<int,double>::type C<int>::foo<double>(int,double)
{
return 0;
}


Ça ne fonctionne pas plus. Par contre, je viens de trouver un remède en
utilisant la surchage de foo :

template <class T1, class T2>
struct Trait
{
typedef T1 type;
};

template <class T1>
struct C
{
template <class T2>
typename Trait<T1,T2>::type foo (T1,T2);

typename Trait<T1,double>::type foo(T1, double);
};

template<>
Trait<int,double>::type C<int>::foo(int,double)
{
return 0;
}

Visual C++ l'accepte.

Pour vérifier, j'ai compilé avec Comeau Online : OK, avec Intel C++ 8.1:
OK mais g++ 3.4.3 se plante en décelant une ambiguïté lors de la
spécialisation.

Je crois que cette fois, c'est un bug dans g++. Je n'ai pas de g++ 4.0.x
sous la main. Quelqu'un peut-il tester le code ci-dessus pour voir si le
bug est corrigé dans les dernières versions ? Sinon, je ferais un
rapport de bug.

Merci.
Marc