Si j'ai effectivement constaté avec des compilateurs aniens que les
templates posaient problème, je suis curieux de savoit actuellement quels
sont les écueils qui existent sur les templates entre différents
compilateurs. Avez vous des exemples précis de la non portabilité de codes
écrits avec les templates ? Si vous en avez constaté, est-il possible
d'écrire un code portable avec les templates et si oui quelles sont les
précautions à prendre pour assurer un maximum de portabilité.
J'ai constaté également que le code écrit avec des templates de manière
assez poussé était d'une part assez illisible, et d'autre part difficilement
déboguable de par son manque de lisibilité et surtout de par les messages
souvent complètement incompréhensibles qu'envoient les compilateurs y
compris parfois pour de simples erreurs. Qu'en pensez-vous ? Faut-il bannir
les templates ? (dommage?)
J'aimerais également avoir votre avis sur l'utilisation de la STL pour
développer un code portable.
Si j'ai effectivement constaté avec des compilateurs aniens que les
templates posaient problème, je suis curieux de savoit actuellement quels
sont les écueils qui existent sur les templates entre différents
compilateurs. Avez vous des exemples précis de la non portabilité de codes
écrits avec les templates ? Si vous en avez constaté, est-il possible
d'écrire un code portable avec les templates et si oui quelles sont les
précautions à prendre pour assurer un maximum de portabilité.
J'ai constaté également que le code écrit avec des templates de manière
assez poussé était d'une part assez illisible, et d'autre part difficilement
déboguable de par son manque de lisibilité et surtout de par les messages
souvent complètement incompréhensibles qu'envoient les compilateurs y
compris parfois pour de simples erreurs. Qu'en pensez-vous ? Faut-il bannir
les templates ? (dommage?)
J'aimerais également avoir votre avis sur l'utilisation de la STL pour
développer un code portable.
Si j'ai effectivement constaté avec des compilateurs aniens que les
templates posaient problème, je suis curieux de savoit actuellement quels
sont les écueils qui existent sur les templates entre différents
compilateurs. Avez vous des exemples précis de la non portabilité de codes
écrits avec les templates ? Si vous en avez constaté, est-il possible
d'écrire un code portable avec les templates et si oui quelles sont les
précautions à prendre pour assurer un maximum de portabilité.
J'ai constaté également que le code écrit avec des templates de manière
assez poussé était d'une part assez illisible, et d'autre part difficilement
déboguable de par son manque de lisibilité et surtout de par les messages
souvent complètement incompréhensibles qu'envoient les compilateurs y
compris parfois pour de simples erreurs. Qu'en pensez-vous ? Faut-il bannir
les templates ? (dommage?)
J'aimerais également avoir votre avis sur l'utilisation de la STL pour
développer un code portable.
Je developpe en C et C++ depuis plusieurs années avec des
Frameworks plus classiques sous windows (MFC et OWL) et essaye
de me mettre à la page notamment en étudiant la STL que je
n'utilisais pas.
En glanant des informations de ci de là, Je suis tombé sur des
affirmations qui semblent sérieuses (site de wxWindows) qui me
posent questions et sur lesquelles j'aimerais avoir des
précisions et l'avis de personnes éclairées
:
En effet on peut lire :
"[i]Templates
wxWidgets does not use templates (except for some advanced
features that are switched off by default) since it is a
notoriously unportable feature.[/i]"
Si j'ai effectivement constaté avec des compilateurs aniens
que les templates posaient problème, je suis curieux de savoit
actuellement quels sont les écueils qui existent sur les
templates entre différents compilateurs. Avez vous des
exemples précis de la non portabilité de codes écrits avec les
templates ? Si vous en avez constaté, est-il possible d'écrire
un code portable avec les templates et si oui quelles sont les
précautions à prendre pour assurer un maximum de portabilité.
J'ai constaté également que le code écrit avec des templates
de manière assez poussé était d'une part assez illisible, et
d'autre part difficilement déboguable de par son manque de
lisibilité et surtout de par les messages souvent complètement
incompréhensibles qu'envoient les compilateurs y compris
parfois pour de simples erreurs. Qu'en pensez-vous ?
Faut-il bannir les templates ? (dommage?)
J'aimerais également avoir votre avis sur l'utilisation de la
STL pour développer un code portable.
Je developpe en C et C++ depuis plusieurs années avec des
Frameworks plus classiques sous windows (MFC et OWL) et essaye
de me mettre à la page notamment en étudiant la STL que je
n'utilisais pas.
En glanant des informations de ci de là, Je suis tombé sur des
affirmations qui semblent sérieuses (site de wxWindows) qui me
posent questions et sur lesquelles j'aimerais avoir des
précisions et l'avis de personnes éclairées
:
En effet on peut lire :
"[i]Templates
wxWidgets does not use templates (except for some advanced
features that are switched off by default) since it is a
notoriously unportable feature.[/i]"
Si j'ai effectivement constaté avec des compilateurs aniens
que les templates posaient problème, je suis curieux de savoit
actuellement quels sont les écueils qui existent sur les
templates entre différents compilateurs. Avez vous des
exemples précis de la non portabilité de codes écrits avec les
templates ? Si vous en avez constaté, est-il possible d'écrire
un code portable avec les templates et si oui quelles sont les
précautions à prendre pour assurer un maximum de portabilité.
J'ai constaté également que le code écrit avec des templates
de manière assez poussé était d'une part assez illisible, et
d'autre part difficilement déboguable de par son manque de
lisibilité et surtout de par les messages souvent complètement
incompréhensibles qu'envoient les compilateurs y compris
parfois pour de simples erreurs. Qu'en pensez-vous ?
Faut-il bannir les templates ? (dommage?)
J'aimerais également avoir votre avis sur l'utilisation de la
STL pour développer un code portable.
Je developpe en C et C++ depuis plusieurs années avec des
Frameworks plus classiques sous windows (MFC et OWL) et essaye
de me mettre à la page notamment en étudiant la STL que je
n'utilisais pas.
En glanant des informations de ci de là, Je suis tombé sur des
affirmations qui semblent sérieuses (site de wxWindows) qui me
posent questions et sur lesquelles j'aimerais avoir des
précisions et l'avis de personnes éclairées
:
En effet on peut lire :
"[i]Templates
wxWidgets does not use templates (except for some advanced
features that are switched off by default) since it is a
notoriously unportable feature.[/i]"
Si j'ai effectivement constaté avec des compilateurs aniens
que les templates posaient problème, je suis curieux de savoit
actuellement quels sont les écueils qui existent sur les
templates entre différents compilateurs. Avez vous des
exemples précis de la non portabilité de codes écrits avec les
templates ? Si vous en avez constaté, est-il possible d'écrire
un code portable avec les templates et si oui quelles sont les
précautions à prendre pour assurer un maximum de portabilité.
J'ai constaté également que le code écrit avec des templates
de manière assez poussé était d'une part assez illisible, et
d'autre part difficilement déboguable de par son manque de
lisibilité et surtout de par les messages souvent complètement
incompréhensibles qu'envoient les compilateurs y compris
parfois pour de simples erreurs. Qu'en pensez-vous ?
Faut-il bannir les templates ? (dommage?)
J'aimerais également avoir votre avis sur l'utilisation de la
STL pour développer un code portable.
>> Faut-il bannir les templates ? (dommage?)
Qu'est-ce que tu proposes d'alternatif ? Dans le temps avant
templates, je me suis bien servi de <generic.h>. Alors, si c'est
l'illisible que tu cherches...
En général, une utilisation plus ou moins limitée de la STL ne
pose pas de problèmes. Le seul problème de portabilité que je
constate avec la STL, c'est que certains compilateurs livrent
encore des versions assez anciennes, qui datent d'avant le
support des membres template, et que du coup, tu ne peux pas
utiliser les membres template dans du code portable. Ce qui
touche surtout, au moins dans mon code, les constructeurs à deux
itérateurs ; à la place de :
std::vector< T > v( autreContainer.begin(),
autreContainer.end() ) ;
, il faut écrire :
std::vector< T > v ;
std::copy( autreContainer.begin(),
autreContainer.end(),
std::back_inserter( v ) ) ;
>> Faut-il bannir les templates ? (dommage?)
Qu'est-ce que tu proposes d'alternatif ? Dans le temps avant
templates, je me suis bien servi de <generic.h>. Alors, si c'est
l'illisible que tu cherches...
En général, une utilisation plus ou moins limitée de la STL ne
pose pas de problèmes. Le seul problème de portabilité que je
constate avec la STL, c'est que certains compilateurs livrent
encore des versions assez anciennes, qui datent d'avant le
support des membres template, et que du coup, tu ne peux pas
utiliser les membres template dans du code portable. Ce qui
touche surtout, au moins dans mon code, les constructeurs à deux
itérateurs ; à la place de :
std::vector< T > v( autreContainer.begin(),
autreContainer.end() ) ;
, il faut écrire :
std::vector< T > v ;
std::copy( autreContainer.begin(),
autreContainer.end(),
std::back_inserter( v ) ) ;
>> Faut-il bannir les templates ? (dommage?)
Qu'est-ce que tu proposes d'alternatif ? Dans le temps avant
templates, je me suis bien servi de <generic.h>. Alors, si c'est
l'illisible que tu cherches...
En général, une utilisation plus ou moins limitée de la STL ne
pose pas de problèmes. Le seul problème de portabilité que je
constate avec la STL, c'est que certains compilateurs livrent
encore des versions assez anciennes, qui datent d'avant le
support des membres template, et que du coup, tu ne peux pas
utiliser les membres template dans du code portable. Ce qui
touche surtout, au moins dans mon code, les constructeurs à deux
itérateurs ; à la place de :
std::vector< T > v( autreContainer.begin(),
autreContainer.end() ) ;
, il faut écrire :
std::vector< T > v ;
std::copy( autreContainer.begin(),
autreContainer.end(),
std::back_inserter( v ) ) ;
Recadrons le sujet: tu parles bien d'utiliser la STL, pas
d'écrire tes propres templates ? Dans ce cas, je ne vois pas
quel pourrait être le souci de portabilité: chaque compilo
C++ est fournis avec une version de la STL, et arrive
à la compiler. Non ?
Il y a des gens qui "jouent" avec les template. A mon sens, les
templates
C++ ont ouvert de nouveaux paradigmes de programmation, et les usages
ne sont pas encore figés.
Je pense que si tu remplaces le mot "template" par le mot "objet",
tu retrouveras des inquiétudes que les programmeurs avaient il y a
15 ans...
Quand on commence avec les templates, en effet, il faut arriver
à sélectionner ses lectures, éviter les gens qui disent "regarder,
c'est super, on arrive même à faire des trucs comme ça", et commencer
par des usages moins entousiates, pragrammatiques, et utiles.
Ben, justement, la STL étant la librairie standard, son principal
avantage sur ses concurents, c'est la portabilité.
Recadrons le sujet: tu parles bien d'utiliser la STL, pas
d'écrire tes propres templates ? Dans ce cas, je ne vois pas
quel pourrait être le souci de portabilité: chaque compilo
C++ est fournis avec une version de la STL, et arrive
à la compiler. Non ?
Il y a des gens qui "jouent" avec les template. A mon sens, les
templates
C++ ont ouvert de nouveaux paradigmes de programmation, et les usages
ne sont pas encore figés.
Je pense que si tu remplaces le mot "template" par le mot "objet",
tu retrouveras des inquiétudes que les programmeurs avaient il y a
15 ans...
Quand on commence avec les templates, en effet, il faut arriver
à sélectionner ses lectures, éviter les gens qui disent "regarder,
c'est super, on arrive même à faire des trucs comme ça", et commencer
par des usages moins entousiates, pragrammatiques, et utiles.
Ben, justement, la STL étant la librairie standard, son principal
avantage sur ses concurents, c'est la portabilité.
Recadrons le sujet: tu parles bien d'utiliser la STL, pas
d'écrire tes propres templates ? Dans ce cas, je ne vois pas
quel pourrait être le souci de portabilité: chaque compilo
C++ est fournis avec une version de la STL, et arrive
à la compiler. Non ?
Il y a des gens qui "jouent" avec les template. A mon sens, les
templates
C++ ont ouvert de nouveaux paradigmes de programmation, et les usages
ne sont pas encore figés.
Je pense que si tu remplaces le mot "template" par le mot "objet",
tu retrouveras des inquiétudes que les programmeurs avaient il y a
15 ans...
Quand on commence avec les templates, en effet, il faut arriver
à sélectionner ses lectures, éviter les gens qui disent "regarder,
c'est super, on arrive même à faire des trucs comme ça", et commencer
par des usages moins entousiates, pragrammatiques, et utiles.
Ben, justement, la STL étant la librairie standard, son principal
avantage sur ses concurents, c'est la portabilité.
wxWidgets does not use templates
wxWidgets does not use templates
wxWidgets does not use templates
En général, une utilisation plus ou moins limitée de la STL ne
pose pas de problèmes. Le seul problème de portabilité que je
constate avec la STL, c'est que certains compilateurs livrent
encore des versions assez anciennes, qui datent d'avant le
support des membres template, et que du coup, tu ne peux pas
utiliser les membres template dans du code portable.
Ce qui
touche surtout, au moins dans mon code, les constructeurs à deux
itérateurs ; à la place de :
std::vector< T > v( autreContainer.begin(),
autreContainer.end() ) ;
, il faut écrire :
std::vector< T > v ;
std::copy( autreContainer.begin(),
autreContainer.end(),
std::back_inserter( v ) ) ;
je ne voudrais pas paraitre ignare, mais suis un peu "à la traine" en ce qui
concerne les nouveautés (oui je sais 10 ans déjà!!), mais pourrais-tu
m'éclairer sur ce que tu appeles membres template ? et peut être comprendre
pourquoi la deuxième forme indiquée fonctionne mieux que la première ...
En général, une utilisation plus ou moins limitée de la STL ne
pose pas de problèmes. Le seul problème de portabilité que je
constate avec la STL, c'est que certains compilateurs livrent
encore des versions assez anciennes, qui datent d'avant le
support des membres template, et que du coup, tu ne peux pas
utiliser les membres template dans du code portable.
Ce qui
touche surtout, au moins dans mon code, les constructeurs à deux
itérateurs ; à la place de :
std::vector< T > v( autreContainer.begin(),
autreContainer.end() ) ;
, il faut écrire :
std::vector< T > v ;
std::copy( autreContainer.begin(),
autreContainer.end(),
std::back_inserter( v ) ) ;
je ne voudrais pas paraitre ignare, mais suis un peu "à la traine" en ce qui
concerne les nouveautés (oui je sais 10 ans déjà!!), mais pourrais-tu
m'éclairer sur ce que tu appeles membres template ? et peut être comprendre
pourquoi la deuxième forme indiquée fonctionne mieux que la première ...
En général, une utilisation plus ou moins limitée de la STL ne
pose pas de problèmes. Le seul problème de portabilité que je
constate avec la STL, c'est que certains compilateurs livrent
encore des versions assez anciennes, qui datent d'avant le
support des membres template, et que du coup, tu ne peux pas
utiliser les membres template dans du code portable.
Ce qui
touche surtout, au moins dans mon code, les constructeurs à deux
itérateurs ; à la place de :
std::vector< T > v( autreContainer.begin(),
autreContainer.end() ) ;
, il faut écrire :
std::vector< T > v ;
std::copy( autreContainer.begin(),
autreContainer.end(),
std::back_inserter( v ) ) ;
je ne voudrais pas paraitre ignare, mais suis un peu "à la traine" en ce qui
concerne les nouveautés (oui je sais 10 ans déjà!!), mais pourrais-tu
m'éclairer sur ce que tu appeles membres template ? et peut être comprendre
pourquoi la deuxième forme indiquée fonctionne mieux que la première ...
> En général, une utilisation plus ou moins limitée de la STL
> ne pose pas de problèmes. Le seul problème de portabilité
> que je constate avec la STL, c'est que certains compilateurs
> livrent encore des versions assez anciennes, qui datent
> d'avant le support des membres template, et que du coup, tu
> ne peux pas utiliser les membres template dans du code
> portable. Ce qui touche surtout, au moins dans mon code, les
> constructeurs à deux itérateurs ; à la place de :
> std::vector< T > v( autreContainer.begin(),
> autreContainer.end() ) ;
> , il faut écrire :
> std::vector< T > v ;
> std::copy( autreContainer.begin(),
> autreContainer.end(),
> std::back_inserter( v ) ) ;
je ne voudrais pas paraitre ignare, mais suis un peu "à la
traine" en ce qui concerne les nouveautés (oui je sais 10 ans
déjà!!), mais pourrais-tu m'éclairer sur ce que tu appeles
membres template ?
et peut être comprendre pourquoi la deuxième forme indiquée
fonctionne mieux que la première ...
> En général, une utilisation plus ou moins limitée de la STL
> ne pose pas de problèmes. Le seul problème de portabilité
> que je constate avec la STL, c'est que certains compilateurs
> livrent encore des versions assez anciennes, qui datent
> d'avant le support des membres template, et que du coup, tu
> ne peux pas utiliser les membres template dans du code
> portable. Ce qui touche surtout, au moins dans mon code, les
> constructeurs à deux itérateurs ; à la place de :
> std::vector< T > v( autreContainer.begin(),
> autreContainer.end() ) ;
> , il faut écrire :
> std::vector< T > v ;
> std::copy( autreContainer.begin(),
> autreContainer.end(),
> std::back_inserter( v ) ) ;
je ne voudrais pas paraitre ignare, mais suis un peu "à la
traine" en ce qui concerne les nouveautés (oui je sais 10 ans
déjà!!), mais pourrais-tu m'éclairer sur ce que tu appeles
membres template ?
et peut être comprendre pourquoi la deuxième forme indiquée
fonctionne mieux que la première ...
> En général, une utilisation plus ou moins limitée de la STL
> ne pose pas de problèmes. Le seul problème de portabilité
> que je constate avec la STL, c'est que certains compilateurs
> livrent encore des versions assez anciennes, qui datent
> d'avant le support des membres template, et que du coup, tu
> ne peux pas utiliser les membres template dans du code
> portable. Ce qui touche surtout, au moins dans mon code, les
> constructeurs à deux itérateurs ; à la place de :
> std::vector< T > v( autreContainer.begin(),
> autreContainer.end() ) ;
> , il faut écrire :
> std::vector< T > v ;
> std::copy( autreContainer.begin(),
> autreContainer.end(),
> std::back_inserter( v ) ) ;
je ne voudrais pas paraitre ignare, mais suis un peu "à la
traine" en ce qui concerne les nouveautés (oui je sais 10 ans
déjà!!), mais pourrais-tu m'éclairer sur ce que tu appeles
membres template ?
et peut être comprendre pourquoi la deuxième forme indiquée
fonctionne mieux que la première ...
"Christian PANEL" wrote:
>> En général, une utilisation plus ou moins limitée de la STL
>> ne pose pas de problèmes. Le seul problème de portabilité
>> que je constate avec la STL, c'est que certains
>> compilateurs livrent encore des versions assez anciennes,
>> qui datent d'avant le support des membres template, et que
>> du coup, tu ne peux pas utiliser les membres template dans
>> du code portable.
Il y en a d'autres que Sun Studio qui ont ce problème ? (et
encore, ce compilateur vient avec 1 ou 2 autres
implémentations de la bibliothèque standard, qui elles sont
standard)
>> Ce qui
>> touche surtout, au moins dans mon code, les constructeurs à deux
>> itérateurs ; à la place de :
>> std::vector< T > v( autreContainer.begin(),
>> autreContainer.end() ) ;
>> , il faut écrire :
>> std::vector< T > v ;
>> std::copy( autreContainer.begin(),
>> autreContainer.end(),
>> std::back_inserter( v ) ) ;
L'impossibilité de convertir les std::pair entre eux est
pénible aussi (l'avantage c'est qu'on n'utilise du coup jamais
map::insert(make_pair(a,b)) avec sa copie inutile).
Certains compilateurs ont implémenté ça avec un peu de retard
et ont donc livré des bibliothèques "standard" privées de
cette fonction.
Par crainte de créer des incompatibilités au niveau de l'ABI,
ils n'ont pas rajouté après coup ces fonctions, même quand le
compilateur a appris à les gérer.
Mais vraiment, je te recommande d'ignorer ce problème, à moins
d'avoir un très fort impératif à court terme de développer
pour une plate-forme particulière ayant ce problème.
Pour écrire du code portable, tester reste une des meilleures
solutions. MSVC, g++ et un compilateur utilisant EDG (Intel
par exemple) forment un échantillon raisonnable.
Rajouter Sun Studio (-library=stlport4) sur Solaris permet de
détecter les problèmes de std:: et extern "C", et fournit
aussi un exemple d'implémentation où vector::iterator est un
pointeur (donc pas de --v.end(), merci) ; malheureusement il
vient aussi avec un peu plus de bugs que les 3 autres.
"Christian PANEL" wrote:
>> En général, une utilisation plus ou moins limitée de la STL
>> ne pose pas de problèmes. Le seul problème de portabilité
>> que je constate avec la STL, c'est que certains
>> compilateurs livrent encore des versions assez anciennes,
>> qui datent d'avant le support des membres template, et que
>> du coup, tu ne peux pas utiliser les membres template dans
>> du code portable.
Il y en a d'autres que Sun Studio qui ont ce problème ? (et
encore, ce compilateur vient avec 1 ou 2 autres
implémentations de la bibliothèque standard, qui elles sont
standard)
>> Ce qui
>> touche surtout, au moins dans mon code, les constructeurs à deux
>> itérateurs ; à la place de :
>> std::vector< T > v( autreContainer.begin(),
>> autreContainer.end() ) ;
>> , il faut écrire :
>> std::vector< T > v ;
>> std::copy( autreContainer.begin(),
>> autreContainer.end(),
>> std::back_inserter( v ) ) ;
L'impossibilité de convertir les std::pair entre eux est
pénible aussi (l'avantage c'est qu'on n'utilise du coup jamais
map::insert(make_pair(a,b)) avec sa copie inutile).
Certains compilateurs ont implémenté ça avec un peu de retard
et ont donc livré des bibliothèques "standard" privées de
cette fonction.
Par crainte de créer des incompatibilités au niveau de l'ABI,
ils n'ont pas rajouté après coup ces fonctions, même quand le
compilateur a appris à les gérer.
Mais vraiment, je te recommande d'ignorer ce problème, à moins
d'avoir un très fort impératif à court terme de développer
pour une plate-forme particulière ayant ce problème.
Pour écrire du code portable, tester reste une des meilleures
solutions. MSVC, g++ et un compilateur utilisant EDG (Intel
par exemple) forment un échantillon raisonnable.
Rajouter Sun Studio (-library=stlport4) sur Solaris permet de
détecter les problèmes de std:: et extern "C", et fournit
aussi un exemple d'implémentation où vector::iterator est un
pointeur (donc pas de --v.end(), merci) ; malheureusement il
vient aussi avec un peu plus de bugs que les 3 autres.
"Christian PANEL" wrote:
>> En général, une utilisation plus ou moins limitée de la STL
>> ne pose pas de problèmes. Le seul problème de portabilité
>> que je constate avec la STL, c'est que certains
>> compilateurs livrent encore des versions assez anciennes,
>> qui datent d'avant le support des membres template, et que
>> du coup, tu ne peux pas utiliser les membres template dans
>> du code portable.
Il y en a d'autres que Sun Studio qui ont ce problème ? (et
encore, ce compilateur vient avec 1 ou 2 autres
implémentations de la bibliothèque standard, qui elles sont
standard)
>> Ce qui
>> touche surtout, au moins dans mon code, les constructeurs à deux
>> itérateurs ; à la place de :
>> std::vector< T > v( autreContainer.begin(),
>> autreContainer.end() ) ;
>> , il faut écrire :
>> std::vector< T > v ;
>> std::copy( autreContainer.begin(),
>> autreContainer.end(),
>> std::back_inserter( v ) ) ;
L'impossibilité de convertir les std::pair entre eux est
pénible aussi (l'avantage c'est qu'on n'utilise du coup jamais
map::insert(make_pair(a,b)) avec sa copie inutile).
Certains compilateurs ont implémenté ça avec un peu de retard
et ont donc livré des bibliothèques "standard" privées de
cette fonction.
Par crainte de créer des incompatibilités au niveau de l'ABI,
ils n'ont pas rajouté après coup ces fonctions, même quand le
compilateur a appris à les gérer.
Mais vraiment, je te recommande d'ignorer ce problème, à moins
d'avoir un très fort impératif à court terme de développer
pour une plate-forme particulière ayant ce problème.
Pour écrire du code portable, tester reste une des meilleures
solutions. MSVC, g++ et un compilateur utilisant EDG (Intel
par exemple) forment un échantillon raisonnable.
Rajouter Sun Studio (-library=stlport4) sur Solaris permet de
détecter les problèmes de std:: et extern "C", et fournit
aussi un exemple d'implémentation où vector::iterator est un
pointeur (donc pas de --v.end(), merci) ; malheureusement il
vient aussi avec un peu plus de bugs que les 3 autres.
Je n'en sais rien, mais Sun CC, c'est bien un compilateur
répandu et important. Et oui, il vient avec une version de la
STLport, aussi. Mais celle-ci est tellement boguée qu'elle est
inutilisable.
Tu peux facilement écrire autour de quelque chose
qui manque -- après tous, tu écrivais bien des programmes avant
qu'il a été ajouté ailleurs. Mais certains bogues sont carrément
incontournable, et rend des pans entiers de la bibliothèque
(comme <locale>) complètement inutilisable.
Il y aussi VC++ 6. Périmé, certes, mais il sert encore à
certains endroits.
La question finale, évidemment, c'est jusqu'à où pousser la
portabilité. Si des versions relativement récentes de g++ et de
VC++ te suffisent, ce n'est pas un problème.
L'impossibilité de convertir les std::pair entre eux est
pénible aussi (l'avantage c'est qu'on n'utilise du coup jamais
map::insert(make_pair(a,b)) avec sa copie inutile).
C'est marrant ; je ne crois pas d'avoir eu des problèmes à cet
égard. Mais il faut dire que j'ai toujours privilégé le style :
unMap.insert( MapType::value_type( cle, valeur ) ) ;
sur le make_pair. (Je ne sais pas pourquoi, d'ailleurs, mais tu
viens de m'en donner une raison de plus.)
[en ce concerne les fonctions membre...]Certains compilateurs ont implémenté ça avec un peu de retard
Il ne faut pas oublier que la première spécification des
templates (dans l'ARM) ne comportait pas de templates membres,
Par crainte de créer des incompatibilités au niveau de l'ABI,
ils n'ont pas rajouté après coup ces fonctions, même quand le
compilateur a appris à les gérer.
L'histoire chez Sun est encore plus compliqué, je crois ; en
tout cas, la version de la bibliothèque Rogue Wave dont se sert
le compilateur par défaut est fort ancienne.
Pour écrire du code portable, tester reste une des meilleures
solutions. MSVC, g++ et un compilateur utilisant EDG (Intel
par exemple) forment un échantillon raisonnable.
Si tu vises la portabilité maximum, pas vraiment, parce qu'ils
sont tous les trois assez à jour, et à l'exception d'export,
assez proche de la norme. Or, si tu vises la portabilité, il te
faut des anciens compilateurs, ou ceux qui n'implémente pas
encore toutes les nouveautés.
Rajouter Sun Studio (-library=stlport4) sur Solaris permet de
détecter les problèmes de std:: et extern "C", et fournit
aussi un exemple d'implémentation où vector::iterator est un
pointeur (donc pas de --v.end(), merci) ; malheureusement il
vient aussi avec un peu plus de bugs que les 3 autres.
Un peu plus, c'est peu dire. En ce qui concerne les collections
et les algorithmes, ça va encore, mais les iostream et les
locales sont quasiment inutilisable.
Il y a aussi le problème de pourquoi tu veux être portable. Dans
la pratique, sous Solaris, on utilise g++, plutôt que Sun CC, si
on peut. Seulement, très souvent, on doit linké avec des
bibliothèques tièrces, qui sont la plupart du temps livrées
seulement en version Sun CC, avec la bibliothèque Sun par
défaut. Dans la pratique, je n'ai jamais connu un contexte
professionnel où Sun CC plus STLport avait un sens.
Je n'en sais rien, mais Sun CC, c'est bien un compilateur
répandu et important. Et oui, il vient avec une version de la
STLport, aussi. Mais celle-ci est tellement boguée qu'elle est
inutilisable.
Tu peux facilement écrire autour de quelque chose
qui manque -- après tous, tu écrivais bien des programmes avant
qu'il a été ajouté ailleurs. Mais certains bogues sont carrément
incontournable, et rend des pans entiers de la bibliothèque
(comme <locale>) complètement inutilisable.
Il y aussi VC++ 6. Périmé, certes, mais il sert encore à
certains endroits.
La question finale, évidemment, c'est jusqu'à où pousser la
portabilité. Si des versions relativement récentes de g++ et de
VC++ te suffisent, ce n'est pas un problème.
L'impossibilité de convertir les std::pair entre eux est
pénible aussi (l'avantage c'est qu'on n'utilise du coup jamais
map::insert(make_pair(a,b)) avec sa copie inutile).
C'est marrant ; je ne crois pas d'avoir eu des problèmes à cet
égard. Mais il faut dire que j'ai toujours privilégé le style :
unMap.insert( MapType::value_type( cle, valeur ) ) ;
sur le make_pair. (Je ne sais pas pourquoi, d'ailleurs, mais tu
viens de m'en donner une raison de plus.)
[en ce concerne les fonctions membre...]
Certains compilateurs ont implémenté ça avec un peu de retard
Il ne faut pas oublier que la première spécification des
templates (dans l'ARM) ne comportait pas de templates membres,
Par crainte de créer des incompatibilités au niveau de l'ABI,
ils n'ont pas rajouté après coup ces fonctions, même quand le
compilateur a appris à les gérer.
L'histoire chez Sun est encore plus compliqué, je crois ; en
tout cas, la version de la bibliothèque Rogue Wave dont se sert
le compilateur par défaut est fort ancienne.
Pour écrire du code portable, tester reste une des meilleures
solutions. MSVC, g++ et un compilateur utilisant EDG (Intel
par exemple) forment un échantillon raisonnable.
Si tu vises la portabilité maximum, pas vraiment, parce qu'ils
sont tous les trois assez à jour, et à l'exception d'export,
assez proche de la norme. Or, si tu vises la portabilité, il te
faut des anciens compilateurs, ou ceux qui n'implémente pas
encore toutes les nouveautés.
Rajouter Sun Studio (-library=stlport4) sur Solaris permet de
détecter les problèmes de std:: et extern "C", et fournit
aussi un exemple d'implémentation où vector::iterator est un
pointeur (donc pas de --v.end(), merci) ; malheureusement il
vient aussi avec un peu plus de bugs que les 3 autres.
Un peu plus, c'est peu dire. En ce qui concerne les collections
et les algorithmes, ça va encore, mais les iostream et les
locales sont quasiment inutilisable.
Il y a aussi le problème de pourquoi tu veux être portable. Dans
la pratique, sous Solaris, on utilise g++, plutôt que Sun CC, si
on peut. Seulement, très souvent, on doit linké avec des
bibliothèques tièrces, qui sont la plupart du temps livrées
seulement en version Sun CC, avec la bibliothèque Sun par
défaut. Dans la pratique, je n'ai jamais connu un contexte
professionnel où Sun CC plus STLport avait un sens.
Je n'en sais rien, mais Sun CC, c'est bien un compilateur
répandu et important. Et oui, il vient avec une version de la
STLport, aussi. Mais celle-ci est tellement boguée qu'elle est
inutilisable.
Tu peux facilement écrire autour de quelque chose
qui manque -- après tous, tu écrivais bien des programmes avant
qu'il a été ajouté ailleurs. Mais certains bogues sont carrément
incontournable, et rend des pans entiers de la bibliothèque
(comme <locale>) complètement inutilisable.
Il y aussi VC++ 6. Périmé, certes, mais il sert encore à
certains endroits.
La question finale, évidemment, c'est jusqu'à où pousser la
portabilité. Si des versions relativement récentes de g++ et de
VC++ te suffisent, ce n'est pas un problème.
L'impossibilité de convertir les std::pair entre eux est
pénible aussi (l'avantage c'est qu'on n'utilise du coup jamais
map::insert(make_pair(a,b)) avec sa copie inutile).
C'est marrant ; je ne crois pas d'avoir eu des problèmes à cet
égard. Mais il faut dire que j'ai toujours privilégé le style :
unMap.insert( MapType::value_type( cle, valeur ) ) ;
sur le make_pair. (Je ne sais pas pourquoi, d'ailleurs, mais tu
viens de m'en donner une raison de plus.)
[en ce concerne les fonctions membre...]Certains compilateurs ont implémenté ça avec un peu de retard
Il ne faut pas oublier que la première spécification des
templates (dans l'ARM) ne comportait pas de templates membres,
Par crainte de créer des incompatibilités au niveau de l'ABI,
ils n'ont pas rajouté après coup ces fonctions, même quand le
compilateur a appris à les gérer.
L'histoire chez Sun est encore plus compliqué, je crois ; en
tout cas, la version de la bibliothèque Rogue Wave dont se sert
le compilateur par défaut est fort ancienne.
Pour écrire du code portable, tester reste une des meilleures
solutions. MSVC, g++ et un compilateur utilisant EDG (Intel
par exemple) forment un échantillon raisonnable.
Si tu vises la portabilité maximum, pas vraiment, parce qu'ils
sont tous les trois assez à jour, et à l'exception d'export,
assez proche de la norme. Or, si tu vises la portabilité, il te
faut des anciens compilateurs, ou ceux qui n'implémente pas
encore toutes les nouveautés.
Rajouter Sun Studio (-library=stlport4) sur Solaris permet de
détecter les problèmes de std:: et extern "C", et fournit
aussi un exemple d'implémentation où vector::iterator est un
pointeur (donc pas de --v.end(), merci) ; malheureusement il
vient aussi avec un peu plus de bugs que les 3 autres.
Un peu plus, c'est peu dire. En ce qui concerne les collections
et les algorithmes, ça va encore, mais les iostream et les
locales sont quasiment inutilisable.
Il y a aussi le problème de pourquoi tu veux être portable. Dans
la pratique, sous Solaris, on utilise g++, plutôt que Sun CC, si
on peut. Seulement, très souvent, on doit linké avec des
bibliothèques tièrces, qui sont la plupart du temps livrées
seulement en version Sun CC, avec la bibliothèque Sun par
défaut. Dans la pratique, je n'ai jamais connu un contexte
professionnel où Sun CC plus STLport avait un sens.