Merkwürdiger Fehler: New akzeptiert keine zwei Parameter



  • VC++ hat mit das beim kompilieren meines momentanen Projekts ausgegeben. Die Headerdatei, in der der Fehler liegt ist xmemory.
    Hier die Fehler:

    c:\programme\microsoft visual studio\vc98\include\xmemory(34) : error C2660: 'new' : Funktion akzeptiert keine 2 Parameter
            c:\programme\microsoft visual studio\vc98\include\xmemory(66) : Siehe Verweis auf Instantiierung der kompilierten Funktionsvorlage 'void __cdecl std::_Construct(class Unit *,const class Unit &)'
    c:\programme\microsoft visual studio\vc98\include\xmemory(34) : error C2660: 'new' : Funktion akzeptiert keine 2 Parameter
            c:\programme\microsoft visual studio\vc98\include\xmemory(66) : Siehe Verweis auf Instantiierung der kompilierten Funktionsvorlage 'void __cdecl std::_Construct(class SmartDecoState<class Building> *,const class SmartDecoState<class Building
    > &)'
    Fehler beim Ausführen von cl.exe.
    
    PNFramework_5.dll - 2 Fehler, 0 Warnung(en)
    

    Leider weis ich nicht welchen Quellcode ich Posten soll, aber das hier hilft sicher weiter:

    template <> class Base<true>
    {
    protected:
        virtual inline void del(){}
    private:
        inline ~Base(){}
    public:
        Base(){}
        virtual void destroy(){del(); delete this;}
    	friend void* operator new(size_t);
    	friend void  operator delete(void*, size_t);
    
    };
    
    template <> class Base<false>
    {
    public:
        Base(){}
        virtual ~Base(){}
    private:
        static void* operator new(size_t size){return 0;}
        static void operator delete(void* rawmemory){}
        static void* operator new[](size_t size){return 0;}
        static void operator delete[](void* rawmemory){}
    };
    
    template <typename T> class DLL SmartDecoState : public Base<false>//Smart_ptr + Decorator + State
    {
    protected:
    	int* refcount;
        T* ptr;
    public:
        inline SmartDecoState(){ptr = __new<T>(); refcount = new int(1);}
        explicit inline SmartDecoState(T* nptr, int* nref):ptr(nptr),refcount(nref){(*refcount)++;}
        DLL inline SmartDecoState(const SmartDecoState<T>& param);
        virtual ~SmartDecoState(){if(*refcount == 1){ptr->destroy();delete refcount;}else (*refcount)--;}
        DLL inline void newUnit(T* nptr, int* nref);
    
        DLL SmartDecoState<T>& operator=(const SmartDecoState<T>& param);
    
        DLL T* operator->() const;
        DLL T& operator *() const;
    };
    
    class DLL Unit : public SmartDecoState<Warrior_base>
    {
    public:
    
    	friend bool ::letitdie(Unit* ptr);
    
        inline void setdmga(int& ndmga);
        inline void setdmgg(int& ndmgg);
        inline void setdmg(int& ndmg);
        inline void setHP(int& nHP);
        inline void setHP_max(int& nHP_max);
        inline void setmana(int& nmana);
        inline void setarmor(int& narmor);
        inline void setfast(int& nfast);
        inline void setsee(int& nsee);
        inline void setfreq(int& nfreq);
        inline void setradius(int& nradius);
        inline void setflying(bool& nflying);
        inline void setgive_exp(int& ngive_exp);
        inline void setnow_exp(int& nnow_exp);
        inline void setneeded_exp(int& nneeded_exp);
        inline void setlevel(int& nlevel);
        inline void setneededsupport(int& nsupport);
    
        inline int getdmga() const {if(ptr){return ptr->getdmga();}return 0;}
    	inline int getdmgg() const {if(ptr){return ptr->getdmgg();}return 0;}
        inline int getdmg() const {if(ptr){return ptr->getdmg();}return 0;}
        inline int getHP() const {if(ptr){return ptr->getHP();}return 0;}
        inline int getHP_max() const {if(ptr){return ptr->getHP_max();}return 0;}
        inline int getmana() const {if(ptr){return ptr->getmana();}return 0;}
        inline int getarmor() const {if(ptr){return ptr->getarmor();}return 0;}
        inline int getfast() const {if(ptr){return ptr->getfast();}return 0;}
        inline int getsee() const {if(ptr){return ptr->getsee();}return 0;}
        inline int getfreq() const {if(ptr){return ptr->getfreq();}return 0;}
        inline int getradius() const {if(ptr){return ptr->getradius();}return 0;}
    	inline bool getflying() const {if(ptr){return ptr->getflying();}return false;}
        inline int getgive_exp() const {if(ptr){return ptr->getgive_exp();}return 0;}
        inline int getnow_exp() const {if(ptr){return ptr->getnow_exp();}return 0;}
        inline int getneeded_exp() const {if(ptr){return ptr->getneeded_exp();}return 0;}
        inline int getlevel() const {if(ptr){return ptr->getlevel();}return 0;}
        inline int getneededsupport() const {if(ptr){ptr->getneededsupport();}return 0;}
    
        explicit Unit(Warrior_base* nptr, int* nrefcount);
    
        bool attack(Unit* opponent);
        bool magic(Unit* opponent, int mkdmg);
    
    protected:
    	bool levelup();
    };
    

    Sorry wenn da jetzt Fehler drin sind, ist ziemlich ausm Zusammenhang gerissen.

    thx im vorraus ^^

    Glamdring



  • nein das hilft nicht weiter!
    im fehler gibts ne zeilenangabe,wenn in der zeile ein new ist, dann kannste die zeile alleine bzw mit der definition/deklaration von new posten.
    so hat hier keiner lust auch nur einen blick dran zu vergeuden.

    und noch ein wort zum montag:

    inline SmartDecoState(){ptr = __new<T>(); refcount = new int(1);}
    

    für den code und generell diese kurzschreibweise könnt ich dich umbringen^^
    eine anweisung=eine Zeile.
    zwei Anweisungen=Zwei Zeilen.
    ...
    und da ich weis wie du die Klasse aufbaun wolltest,geb ich dir direkt noch einen Drauf^^
    du willst die Klasse in main mittels new instanzieren, dann macht es absolut keinen sinn, sowas wie
    T* ptr;
    ptr=new T;
    innerhalb der Klasse zu schreiben,
    T ptr reicht vollkommen aus,da mit der instanzierung der Klasse aufm heap direkt auch für T ptr genug speicherplatz reserviert wird.
    desweiteren ist refcount = new int(1);} absolut hirnrissig.
    int refcount;
    refcount=1;
    und der 3. punkt auf meiner Klage liste ist: wieso leitest du eine Klasse aus einer andren Klasse ab, von der du weist dass sie nicht das erfüllen kann, was du willst.(ich meine hiermit Base<true>)



  • Zu Punkt 1: Das ind Smartptr, d.h. sie werden niemals mit new erzeugt bzw. es macht keinen Sinn.

    Zu Punkt 2: Die Smartptr sind refcounted, deshalb muss das ein Pointer sein

    Zu Punkt 3: Um zu testen wo der Fehler liegt

    Glamdring



  • P.S.: glaubst du wirklich, das es etwas helfen würde dir die Codezeile aus xmemory zu geben (welches, damit es nicht zu verwechslungen kommt, vom Compiler genutzt wird).


Anmelden zum Antworten