Wird der Copy-Konstruktor implizit eingefügt?
-
Habe eine Compiler-Fehlermeldung in der mir gesagt wird, dass irgendwas im Copy-Konstruktor nicht korrekt sei. Dabei habe ich in der Klasse garkeinen Copy-Konstruktor definiert. Wird der automatisch eingefügt?
-
HändyÄndy schrieb:
Habe eine Compiler-Fehlermeldung in der mir gesagt wird, dass irgendwas im Copy-Konstruktor nicht korrekt sei. Dabei habe ich in der Klasse garkeinen Copy-Konstruktor definiert. Wird der automatisch eingefügt?
Bei Bedarf: Ja.
Was sagt denn die Fehlermeldung? Rate ich richtig, wenn ich annehme, dass einer der Member nicht kopierbar ist?
Ebenso erzeugt werden bei Bedarf ein Konstruktor, Destruktor und Zuweisungsoperator.
-
Dank meiner Glaskugel weiß ich zum Glück deine genaue Fehlermeldung und deinen problematischen Code. Und hier die Lösung deines Problems: du musst irgendwas anders machen.
PS: ja der Copy-Ctor wird automatisch erzeugt.
-
In der Tat ist irgendwas nicht kopierbar. Ich denke es ist ein Filehandler (also std::ofstream fileOutput;)
Deshalb habe ich den Code umformuliert. Erhalte nun aber eine für mich völlig unverständliche Compiler-Fehlermeldung.
class Processor { public: boost::unordered_map<std::string, std::auto_ptr<StatisticsObject>, boost::hash<std::string> > statisticsObjects; /*...*/ }; /*...*/ Processor p; void ddos_init() { /*....*/ //initialisiere die statisticsObjects mit den URLs, die aus der Datei gelesen wurden FactorialData factorialData; RandomNumberGenerator rng; for( boost::unordered_map<std::string, ddos_webpage>::const_iterator it = p.mostImportantWebpages.begin(); it != p.mostImportantWebpages.end(); ++it ) p.statisticsObjects[it->first].reset( new StatisticsObject( rng, it->first, factorialData ) ); }Und hier die Klasse StatisticsObject
class StatisticsObject { public: /*....*/ StatisticsObject( RandomNumberGenerator &rng, std::string name, FactorialData &factorialData ); };Wenn ich das dann mit make übersetzen will, dann moniert der Compiler folgendes:
make
g++ -m64 -g -Wall -Werror -Wcomment -I./ -I/usr/src/hend/ -I./boost_1_43_0/include -I./ddos_detector/gsl-1.14/include -o ddos_main.o -c ddos_main.cpp
./boost_1_43_0/include/boost/unordered/detail/util.hpp: In member function ‘void boost::unordered_detail::hash_node_constructor<Alloc, Grouped>::construct_pair(const K&, M*) [with K = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, M = std::auto_ptr<StatisticsObject>, Alloc = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::auto_ptr<StatisticsObject> > >, Grouped = boost::unordered_detail::ungrouped]’:
./boost_1_43_0/include/boost/unordered/detail/unique.hpp:75: instantiated from ‘typename boost::unordered_detail::hash_unique_table<T>::value_type& boost::unordered_detail::hash_unique_table<T>::operator[](const typename T::key_type&) [with T = boost::unordered_detail::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::hash<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::auto_ptr<StatisticsObject> > > >]’
./boost_1_43_0/include/boost/unordered/unordered_map.hpp:406: instantiated from ‘T& boost::unordered_map<K, T, H, P, A>::operator[](const K&) [with K = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, T = std::auto_ptr<StatisticsObject>, H = boost::hash<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, P = std::equal_to<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, A = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::auto_ptr<StatisticsObject> > >]’
ddos_main.cpp:344: instantiated from here
./boost_1_43_0/include/boost/unordered/detail/util.hpp:268: error: no matching function for call to ‘std::auto_ptr<StatisticsObject>::auto_ptr(std::auto_ptr<StatisticsObject>)’
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/memory:349: note: candidates are: std::auto_ptr<_Tp>::auto_ptr(std::auto_ptr_ref<_Tp>) [with _Tp = StatisticsObject]
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/memory:212: note: std::auto_ptr<_Tp>::auto_ptr(std::auto_ptr<_Tp1>&) [with _Tp1 = StatisticsObject, _Tp = StatisticsObject]
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/memory:199: note: std::auto_ptr<_Tp>::auto_ptr(std::auto_ptr<_Tp>&) [with _Tp = StatisticsObject]
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_pair.h: In constructor ‘std::pair<_T1, _T2>::pair(const _T1&, const _T2&) [with _T1 = const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _T2 = std::auto_ptr<StatisticsObject>]’:
./boost_1_43_0/include/boost/unordered/detail/util.hpp:268: instantiated from ‘void boost::unordered_detail::hash_node_constructor<Alloc, Grouped>::construct_pair(const K&, M*) [with K = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, M = std::auto_ptr<StatisticsObject>, Alloc = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::auto_ptr<StatisticsObject> > >, Grouped = boost::unordered_detail::ungrouped]’
./boost_1_43_0/include/boost/unordered/detail/unique.hpp:75: instantiated from ‘typename boost::unordered_detail::hash_unique_table<T>::value_type& boost::unordered_detail::hash_unique_table<T>::operator[](const typename T::key_type&) [with T = boost::unordered_detail::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::hash<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::auto_ptr<StatisticsObject> > > >]’
./boost_1_43_0/include/boost/unordered/unordered_map.hpp:406: instantiated from ‘T& boost::unordered_map<K, T, H, P, A>::operator[](const K&) [with K = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, T = std::auto_ptr<StatisticsObject>, H = boost::hash<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, P = std::equal_to<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, A = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::auto_ptr<StatisticsObject> > >]’
ddos_main.cpp:344: instantiated from here
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_pair.h:85: error: passing ‘const std::auto_ptr<StatisticsObject>’ as ‘this’ argument of ‘std::auto_ptr<_Tp>::operator std::auto_ptr_ref<_Tp1>() [with _Tp1 = StatisticsObject, _Tp = StatisticsObject]’ discards qualifiers
make: *** [ddos_main.o] Error 1
-
std::auto_ptr solltest du nicht als Parameter von Containerklassen benutzen. Verwende besser einen shared_ptr o.ä. (s.a. http://en.wikipedia.org/wiki/Auto_ptr )