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?


  • Mod

    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 )


Anmelden zum Antworten