 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Marc Duflot Guest
|
Posted: Tue Oct 18, 2005 3:55 pm Post subject: Specialisation de templates imbriques |
|
|
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));
}
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Tue Oct 18, 2005 11:34 pm Post subject: Re: Specialisation de templates imbriques |
|
|
On Tue, 18 Oct 2005 17:55:52 +0200, Marc Duflot
<marc.duflot (AT) gmail (DOT) com>:
Quelle version ?
|
|
| Back to top |
|
 |
Marc Duflot Guest
|
Posted: Wed Oct 19, 2005 7:04 am Post subject: Re: Specialisation de templates imbriques |
|
|
Fabien LE LEZ wrote:
| Quote: | On Tue, 18 Oct 2005 17:55:52 +0200, Marc Duflot
[email]marc.duflot (AT) gmail (DOT) com[/email]>:
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.
|
|
| Back to top |
|
 |
Jean-Marc Bourguet Guest
|
Posted: Wed Oct 19, 2005 9:57 am Post subject: Re: Specialisation de templates imbriques |
|
|
Marc Duflot <marc.duflot (AT) gmail (DOT) com> writes:
| Quote: | 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
|
|
| Back to top |
|
 |
Marc Duflot Guest
|
Posted: Wed Oct 19, 2005 11:12 am Post subject: Re: Specialisation de templates imbriques |
|
|
Jean-Marc Bourguet wrote:
| Quote: | Marc Duflot <marc.duflot (AT) gmail (DOT) com> 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.
|
|
| Back to top |
|
 |
Jean-Marc Bourguet Guest
|
Posted: Wed Oct 19, 2005 11:17 am Post subject: Re: Specialisation de templates imbriques |
|
|
Marc Duflot <marc.duflot (AT) gmail (DOT) com> writes:
| Quote: | Jean-Marc Bourguet wrote:
Marc Duflot <marc.duflot (AT) gmail (DOT) com> 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
|
|
| Back to top |
|
 |
Jean-Marc Bourguet Guest
|
Posted: Wed Oct 19, 2005 11:17 am Post subject: Re: Specialisation de templates imbriques |
|
|
Marc Duflot <marc.duflot (AT) gmail (DOT) com> writes:
| Quote: | Jean-Marc Bourguet wrote:
Marc Duflot <marc.duflot (AT) gmail (DOT) com> 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
|
|
| Back to top |
|
 |
Marc Duflot Guest
|
Posted: Wed Oct 19, 2005 11:35 am Post subject: Re: Specialisation de templates imbriques |
|
|
Jean-Marc Bourguet wrote:
| Quote: | Marc Duflot <marc.duflot (AT) gmail (DOT) com> writes:
Jean-Marc Bourguet wrote:
Marc Duflot <marc.duflot (AT) gmail (DOT) com> 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.)
|
|
| Back to top |
|
 |
Jean-Marc Bourguet Guest
|
Posted: Wed Oct 19, 2005 11:49 am Post subject: Re: Specialisation de templates imbriques |
|
|
Marc Duflot <marc.duflot (AT) gmail (DOT) com> writes:
| Quote: | template <class T1, class T2
struct Trait
{
typedef T1 type;
};
template
struct C
{
template
typename Trait
};
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
|
|
| Back to top |
|
 |
Marc Duflot Guest
|
Posted: Wed Oct 19, 2005 12:42 pm Post subject: Re: Specialisation de templates imbriques |
|
|
Jean-Marc Bourguet wrote:
| Quote: | Marc Duflot <marc.duflot (AT) gmail (DOT) com> writes:
template <class T1, class T2
struct Trait
{
typedef T1 type;
};
template
struct C
{
template
typename Trait
};
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
typename Trait
};
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
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|