Template in class?



  • Kann man so 'ne fkt in eine Klasse wrappen? Ansonsten muss ich mein vector global machen.

    template<typename T>
    bool GetPlayerData(const T & data, T PlayerClass::* classMember, PlayerClass & pClass,
    				  const TPlayerVector & myVector )
    {
    	myVectorConstItr Itr;
    	myVectorConstItr ItrEnd;
    
    	Itr    = myVector.begin();
    	ItrEnd = myVector.end();
    
    	for (; Itr !=  ItrEnd; ++Itr )
    	{
    		if((*Itr).*classMember == data)
    		{
    
    			pClass = *Itr;
    			return true;
    		}
    
    	}
    
    	return false;
    }
    


  • Mein versuch..

    #include <string>
    #include <vector>
    
    template <typename T>
    class SkillManager
    {
         public:
         bool GetSkillData(const T &id, T SkillManager<T>::* idMember, SkillManager<T> &theClass, const tSkillManager & myVector);
    
         private:
    
    	 typedef std::vector < SkillManager > tSkillManager;
    	 typedef typename tSkillManager::iterator tSkillItr;
    	 typedef typename tSkillManager::const_iterator tSkillConstItr;
    
    	 tSkillManager skillManager;
    	 tSkillItr skillItr;
    	 tSkillConstItr skillConstItr;
    };
    
    #include "SkillManager.hpp"
    
    template<typename T> bool SkillManager<T>::GetSkillData(const T &id, T SkillManager<T>::* idMember, SkillManager<T> &theClass, const tSkillManager & myVector)
    {
    
    }
    
    SkillManager.hpp(8) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    killManager.hpp(19) : see reference to class template instantiation 'SkillManager<T>' being compiled
    SkillManager.hpp(8) : error C2143: syntax error : missing ',' before '&'
    SkillManager.hpp(8) : see declaration of 'SkillManager<T>::GetSkillData'
            definition
            'bool SkillManager<T>::GetSkillData(const T &,T SkillManager<T>::* ,SkillManager<T> &,const std::vector<SkillManager<T>> &)'
            existing declarations
            'bool SkillManager<T>::GetSkillData(const T &,T SkillManager<T>::* ,SkillManager<T> &,const int)'
    error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    SkillManager.hpp(19) : see reference to class template instantiation 'SkillManager<T>' being compiled
    SkillManager.hpp(8) : error C2143: syntax error : missing ',' before '&'
    


  • Dann muss ich mein vector wohl global machen..



  • huihui schrieb:

    Dann muss ich mein vector wohl global machen..

    aha?
    templates kann man nicht in header und source aufteilen - siehe auch faq...

    bb



  • unskilled schrieb:

    huihui schrieb:

    Dann muss ich mein vector wohl global machen..

    aha?
    templates kann man nicht in header und source aufteilen - siehe auch faq...

    bb

    ty.. ganz vergessen.. kriegs aber immernoch nicht zum laufen 😕

    template <typename T>
    class SkillManager
    {
         public:
    
         bool GetSkillData(const T &id, T SkillManager<T>::* idMember, SkillManager<T> &theClass, const tSkillManager & myVector)
    	 {
    
    	 }
    
         private:
    
    	 typedef std::vector < SkillManager > tSkillManager;
    	 typedef typename tSkillManager::iterator tSkillItr;
    	 typedef typename tSkillManager::const_iterator tSkillConstItr;
    
    	 tSkillManager skillManager;
    	 tSkillItr skillItr;
    	 tSkillConstItr skillConstItr;
    };
    
    SkillManager.hpp(8) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    SkillManager.hpp(22) : see reference to class template instantiation 'SkillManager<T>' being compiled
    error C2143: syntax error : missing ',' before '&'
    
    SkillManager.hpp(8) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    SkillManager.hpp(22) : see reference to class template instantiation 'SkillManager<T>' being compiled
    error C2143: syntax error : missing ',' before '&'
    


  • T SkillManager<T>::* idMember

    Oo

    was willst du denn nun wirklich machen?



  • unskilled schrieb:

    T SkillManager<T>::* idMember

    Oo

    was willst du denn nun wirklich machen?

    guggste 1st post, will die fkt in einer klasse haben.



  • huihui schrieb:

    unskilled schrieb:

    T SkillManager<T>::* idMember

    Oo

    was willst du denn nun wirklich machen?

    guggste 1st post, will die fkt in einer klasse haben.

    ich hab deinen ersten post schon noch mal angeguckt gehabt, bevor ich fragte - entweder, du sagst genau, was du machen möchtest, oder ich kann dir auch nicht helfen - weil davon werd ich nicht schlauer... imho versuchst du dort etwas, was nicht wirklich geht - aber wie gesagt, beschreib mal noch ma, was du machen möchtest

    bb



  • Ein Zeiger auf einen Member - geht, finde ich aber äußerst ungewöhnlich. Vielleicht gibt's da auch einen anderen, besseren Weg? Vor allem, weil du ja einen std::vector<SkillManager> übergeben willst - und auf die Member von SkillManager kannst du ja auch einfach direkt zugreifen. 🙄

    Dein aktuelles Problem ist, dass das typedef tSkillManager erst nach der Definition von GetSkillData() von dir gesetzt wird, es aber schon in der Parameterliste von GetSkillData() verwendet wird.

    So sollte es funktionieren:

    template <typename T>
    class SkillManager
    {
         typedef std::vector < SkillManager > tSkillManager;
         typedef typename tSkillManager::iterator tSkillItr;
         typedef typename tSkillManager::const_iterator tSkillConstItr;
    
         public:
         bool GetSkillData(const T &id, T SkillManager<T>::* idMember, SkillManager<T> &theClass, const tSkillManager & myVector)
         { // dein Code
         }
    
         private:
         tSkillManager skillManager;
         tSkillItr skillItr;
         tSkillConstItr skillConstItr;
    };
    

    Du solltest auch noch darüber nachdenken, ob du nicht das typedef tSkillManager öffentlich machen willst - in einer öffentlichen Funktion verwendest du es eh schon.


Anmelden zum Antworten