templates und linker problem



  • Hallo,

    wollte nur kurz eine Sammlung für das STL-for_each machen (zum probieren).

    namespace STLHelper
    {
       template< typename T>
       CallDeleteOnPointers(T item)
       {
          delete item;
       }
    
    };
    
    int main()
    {
    /*********************************************/
       STLHelper::CallDeleteOnPointers<int*>(0);
    /*********************************************/
    
       vector<int*> vInts;
       vector<int*>::iterator iter = vInts.begin();
       vInts.push_back(new int(1));
       for_each(iter, vInts.end(), STLHelper::CallDeleteOnPointers<int*>);
    
       return 0;
    }
    

    Wenn ich die Zeile zwischen den ** weglasse bekomme ich ein nichtaufgelöstes Symbol.
    Kann ich dem compiler irgendwie (anders) sagen das er bitte diese funktion erstellen soll? Der Workaround oben hilft nix.



  • Hallo,

    ich wuerde das so machen:

    template<typename T>
    struct CallDeleteOnPointers {
        void operator()(T pointer) {
            delete pointer;
        }
    };
    
    int main()
    {
       vector<int*> vInts;
       vInts.push_back(new int(1));
       vector<int*>::iterator iter = vInts.begin();
       for_each(iter, vInts.end(), CallDeleteOnPointers<int*>());
       return 0;
    }
    

    mfg
    v R



  • was hälst du davon, noch weniger schreibarbeit

    template<
    	typename Container_> void CleanContainer(Container_ &t)
    {
    	typename Container_::iterator it;
    
    	for(it = t.begin(); it != t.end(); ++it)
    	    delete *it;
    
    	t.clear();
    }
    
    // aufruf
    CleanContainer(vInts);
    


  • Danke,
    die Lösung funktioniert und ist obendrein noch ein bißchen sauberer ich vergesse das for_each wohl besser... (zuviel C# gemacht)
    Trotdem verunsichert mich die tatsache, das ich offensichtlich generell keine pointer auf templatefunktionen übergeben kann, oder?


Anmelden zum Antworten