Mise à jour: exemple de code modifié pour utiliser AutoA pour la solution de contournement (qui était l'intention d'origine). Réalisé ceci après avoir vu la réponse de rlbond.std :: auto_ptr Problème de compilation dans Visual Studio 6.0
Je suis en train d'intégrer l'utilisation de auto_ptr
dans mon code en fonction des recommandations de ce fil:
Express the usage of C++ arguments through method interfaces
Cependant, je reçois une inattendue erreurs de compilation lors de la compilation avec Visual Studio 6.0. Il a un problème en traitant des affectations/copies d'un std::auto_ptr
d'un type dérivé à un std::auto_ptr
du type de base. Est-ce un problème spécifique à mon compilateur?
Je sais qu'il y a une forte recommandation d'utiliser Boost, mais sur mon projet ce n'est pas une option. Si je veux toujours utiliser auto_ptr
, suis-je obligé d'utiliser la solution de contournement d'appeler std::auto_ptr::release()
? De ce que j'ai rencontré jusqu'à présent, ce problème entraîne une erreur de compilation, il est donc assez facile à attraper. Cependant, l'adoption de la convention d'appel de release pour assigner un 'auto_ptr' du type de base pourrait-elle m'exposer à des problèmes de maintenance? Surtout si construit avec un compilateur différent (en supposant que les autres compilateurs n'ont pas ce problème).
Si la solution de contournement release()
n'est pas bonne en raison de ma situation, devrais-je me référer à une autre convention pour décrire le transfert de propriété?
Voici un exemple illustrant le problème.
#include "stdafx.h"
#include <memory>
struct A
{
int x;
};
struct B : public A
{
int y;
};
typedef std::auto_ptr<A> AutoA;
typedef std::auto_ptr<B> AutoB;
void sink(AutoA a)
{
//Some Code....
}
int main(int argc, char* argv[])
{
//Raws to auto ptr
AutoA a_raw_to_a_auto(new A());
AutoB b_raw_to_b_auto(new B());
AutoA b_raw_to_a_auto(new B());
//autos to same type autos
AutoA a_auto_to_a_auto(a_raw_to_a_auto);
AutoB b_auto_to_b_auto(b_raw_to_b_auto);
//raw derive to auto base
AutoB b_auto(new B());
//auto derive to auto base
AutoA b_auto_to_a_auto(b_auto); //fails to compile
//workaround to avoid compile error.
AutoB b_workaround(new B());
AutoA b_auto_to_a_auto_workaround(b_workaround.release());
sink(a_raw_to_a_auto);
sink(b_raw_to_b_auto); //fails to compile
return 0;
}
Compile Erreur:
Compiling...
Sandbox.cpp
C:\Program Files\Microsoft Visual Studio\MyProjects\Sandbox\Sandbox.cpp(40) : error C2664: '__thiscall std::auto_ptr<struct A>::std::auto_ptr<struct A>(struct A *)' : cannot convert parameter 1 from 'class std::auto_ptr<struct B>' to 'struct A *'
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
C:\Program Files\Microsoft Visual Studio\MyProjects\Sandbox\Sandbox.cpp(47) : error C2664: 'sink' : cannot convert parameter 1 from 'class std::auto_ptr<struct B>' to 'class std::auto_ptr<struct A>'
No constructor could take the source type, or constructor overload resolution was ambiguous
Error executing cl.exe.
Sandbox.exe - 2 error(s), 0 warning(s)
Sérieusement? un compilateur de 11 ans? On pourrait penser que les gens iraient de l'avant. – shoosh
Vous penseriez qu'il y aurait quelque chose à déplacer. 10 est le nouveau 6, mais 10 est toujours en version bêta. –