Update: Bearbeitetes Codebeispiel zur Verwendung von AutoA für die Problemumgehung (was die ursprüngliche Absicht war). Realisierte dies, nachdem er rlbonds Antwort gesehen hatte.std :: auto_ptr Kompilierungsproblem in Visual Studio 6.0
Ich versuche, die Verwendung von auto_ptr
in meinem Code aus diesem Thread basierend auf Empfehlungen zu übernehmen: Jedoch
Express the usage of C++ arguments through method interfaces
, erhalte ich einige unerwartete Fehler kompilieren, wenn sie mit Visual Studio 6.0 zu kompilieren. Es hat ein Problem beim Umgang mit Zuweisungen/Kopien eines std::auto_ptr
eines abgeleiteten Typs zu einem std::auto_ptr
des Basistyps. Ist das ein Problem für meinen Compiler?
Ich weiß, es gibt eine starke Empfehlung, Boost zu verwenden, aber auf meinem Projekt ist es keine Option. Wenn ich immer noch auto_ptr
verwenden möchte, bin ich gezwungen, die Problemumgehung des Aufrufs std::auto_ptr::release()
zu verwenden? Von dem, was ich bis jetzt gesehen habe, führt dieses Problem zu einem Compiler-Fehler, so dass es leicht zu fangen ist. Könnte die Annahme der Vereinbarung, die Freigabe zu einem "auto_ptr" des Basistyps zuzuweisen, mich jedoch allen Wartungsproblemen aussetzen? Vor allem, wenn es mit einem anderen Compiler erstellt wurde (vorausgesetzt, andere Compiler haben dieses Problem nicht).
Wenn die Problemumgehung release()
aufgrund meiner Umstände nicht gut ist, sollte ich auf eine andere Konvention zur Beschreibung der Eigentumsübertragung zurückgreifen?
Das folgende Beispiel veranschaulicht das Problem.
#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 Fehler:
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)
Ernsthaft? ein 11 Jahre alter Compiler? Man könnte meinen, die Leute würden weiterziehen. – shoosh
Sie würden denken, dass es etwas geben würde, um sich zu bewegen. 10 ist die neue 6, aber 10 ist noch in der Beta. –