Redefinition == previous Definition?



  • Hallo,

    ich versuch mich gerade an einer Smartpointer Klasse und GCC spuckt da ne Fehlermeldung aus die ich beim besten Wille nicht versteh:

    main.cpp:68: redefinition of template<class T1, class T2> bool operator!=(const lock\_ptr<Derived>&, const lock\_ptr<T2>&)' main.cpp:68:template<class T1, class T2> bool operator!=(const
    lock_ptr<Derived>&, const lock_ptr<T2>&)' previously declared here

    Das Eigenartige dabei ist allerdings, es handlet sich 2 Mal um die gleiche Definition 😕 .

    Hier ist Code der gesamten Klasse:

    typedef unsigned uint;
    template<class Base>
    class lock_ptr{
    	template<class T>
    	friend class lock_ptr;
      Base*ptr;
    	uint*lock;
    	void release()throw(){
    	  --*lock;
    		if(!*lock){
    		  delete lock;
    			delete ptr;
    		}
    	}
    public:
    	lock_ptr(Base*ptr=0):
    	  ptr(ptr),lock(new uint){
    	  *lock=1;
    	}
    	template<class Derived>
    	lock_ptr(const lock_ptr<Derived>&other):
    		ptr(other.ptr),lock(other.lock){
    	  ++*lock;
    	}
    	template<class Derived>
    	lock_ptr&operator=(const lock_ptr<Derived>&other){
    	  release();
    		ptr=other.ptr;
    		lock=other.lock;
    		++*lock;
    		return*this;
    	}
    	lock_ptr&operator=(Base*new_ptr){
    	  release();
    		ptr=new_ptr;
    		lock=new uint;
    		*lock=1;
    	}
    	~lock_ptr(){
    	  release();
    	}
    	Base&operator*(){
    	  return*ptr;
    	}
    	const Base&operator*()const{
    	  return*ptr;
    	}
    	Base*operator->(){
    	  return ptr;
    	}
    	const Base*operator->()const{
    	  return ptr;
    	}
    	Base*get(){
    	  return ptr;
    	}
    	const Base*get()const{
    	  return ptr;
    	}
    	operator bool()const{
    	  return ptr;
    	}
    	template<class T1,class T2>
      friend bool operator==(const lock_ptr<T1>&t1,const lock_ptr<T2>&t2){
    	  return t1.get()==t2.get();
    	}
    	template<class T1,class T2>
      friend bool operator!=(const lock_ptr<T1>&t1,const lock_ptr<T2>&t2){
    	  return t1.get()!=t2.get();
    	}
    };
    class A{};
    class B:public A{};
    int main(){
      lock_ptr<B>ptr=new B;
    	lock_ptr<A>ptr2=ptr;
    	ptr==ptr2;
    }
    

    Auch und wo wir schon dabei sind dynamic_cast und static_cast kann man (ohne Macros) nicht überladen oder?



  • Du willst doch nicht eine Funktion, die friend ist, innerhalb der Klasse definieren?


Anmelden zum Antworten