C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Specialisation de templates imbriques

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Marc Duflot
Guest





PostPosted: Tue Oct 18, 2005 3:55 pm    Post subject: Specialisation de templates imbriques Reply with 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 ?

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





PostPosted: Tue Oct 18, 2005 11:34 pm    Post subject: Re: Specialisation de templates imbriques Reply with quote



On Tue, 18 Oct 2005 17:55:52 +0200, Marc Duflot
<marc.duflot (AT) gmail (DOT) com>:

Quote:
Visual C++

Quelle version ?


Back to top
Marc Duflot
Guest





PostPosted: Wed Oct 19, 2005 7:04 am    Post subject: Re: Specialisation de templates imbriques Reply with quote



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





PostPosted: Wed Oct 19, 2005 9:57 am    Post subject: Re: Specialisation de templates imbriques Reply with quote

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





PostPosted: Wed Oct 19, 2005 11:12 am    Post subject: Re: Specialisation de templates imbriques Reply with quote

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





PostPosted: Wed Oct 19, 2005 11:17 am    Post subject: Re: Specialisation de templates imbriques Reply with quote

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





PostPosted: Wed Oct 19, 2005 11:17 am    Post subject: Re: Specialisation de templates imbriques Reply with quote

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





PostPosted: Wed Oct 19, 2005 11:35 am    Post subject: Re: Specialisation de templates imbriques Reply with quote

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





PostPosted: Wed Oct 19, 2005 11:49 am    Post subject: Re: Specialisation de templates imbriques Reply with quote

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





PostPosted: Wed Oct 19, 2005 12:42 pm    Post subject: Re: Specialisation de templates imbriques Reply with quote

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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.