Dependent type is not a type



  • Möglichkeit 1:

    class iterator : public std::vector<std::string>::iterator{
    };
    

    Möglichkeit 2:

    typedef std::vector<std::string>::iterator iterator;
    

    warum bitte ist das erste richtig und das zweite falsch? was macht das denn für einen unterschied? das erste geht doch, aber beim zweiten meint der compiler den typ nicht zu kennen

    Warning 1 warning C4346: 'std::vector<std::basic_string<_Elem,std::char_traits<_Elem>,std::allocator<_Ty>>,std::allocator<std::basic_string<_Elem,std::char_traits<_Elem>,std::allocator<_Ty>>>>::iterator' : dependent name is not a type f:\programming\projects\_projects 2013\c++\cell library\include\cell\core\fast_tokenizer.h 103 1 AppConsole (Microsoft Visual C++ Compiler Nov 2012 CTP)



  • Sicher, dass es an der Zeile liegt? Klingt mir irgendwie so, als ob das ganze sich im Kontext eines template abspielt (fehlt wo ein typename)!?


  • Mod

    So freistehend sollte das eigentlich kein Fehler sein. Ist das wirklich 1:1 der Code? Die Fehlermeldung deutet darauf hin, dass hier eigentlich ein Template vorliegt und das nötige typename vor einem Ausdruck a la std::vector<T>::iterator vergessen wurde.



  • namespace cell{
    namespace core{
    
    	// this class can be used to tokenize strings
    	// -> invocation: char_type must be a char, wchar_t, uchar16_t, uchar32_t or any similar character-type
    	//				  separator has to follow the standart separator-interface defined in 'separator.h'
    	template<class char_type, class separator_type = char_separator<char_type> >
    	class fast_tokenizer{
    	public: 
    		typedef std::basic_string<char_type, std::char_traits<char_type>, std::allocator<char_type> > value_type;
    		typedef std::vector<value_type/*, std::allocator<value_type> */> data_type;
    
    	private: 
    		data_type vec_data;
    		separator_type sep;
    
    	public:
    		/* construction */
    		fast_tokenizer()
    			: vec_data()
    			, sep()
    		{}
    
    		fast_tokenizer(const separator_type& token_sep, const value_type& str)
    			: vec_data()
    			, sep(token_sep)
    		{
    			set_data(str);
    		}
    
    	public:
    		/* modifiers */
    		void set_data(const value_type& str){
    			core::tokenizer<char_type,separator_type> tok(str, sep);
    			for(auto it = tok.begin(); it != tok.end(); ++it)
    				vec_data.push_back(*it);
    		}
    		void clear(){
    			//sep.clear();
    			vec_data.clear();
    		}
    
    		/* information */
    		const separator_type& separator() const{
    			return sep;
    		}
    		const std::vector<value_type>& data() const{
    			return data;
    		}
    		const value_type string() const{
    			value_type ret;
    			for(auto i : vec_data)
    				ret += i;
    			return ret;
    		}
    	public: 
    		//class iterator : public data_type::iterator{
    		//};// iterator
    		typedef data_type::iterator iterator;
    	public:
    		/* iterator: helper-funtions */
    		iterator begin(){
    			return vec_data.begin();
    		}
    		iterator end(){
    			return vec_data.end();
    		}
    		value_type front(){
    			return *begin();
    		}
    		value_type back(){
    			return *(end()-1);
    		}
    	};// c: tokenizer
    


  • Jo, das is natürlich was völlig anderes als der Code, den du in deinem Ausgangsposting hattest, da fehlt natürlich überall das Schlüsselwort typename...



  • da fehlt natürlich überall das Schlüsselwort typename...

    tut mir leid, ich kann dir nicht folgen 😕


  • Mod

    gamer8o4 schrieb:

    da fehlt natürlich überall das Schlüsselwort typename...

    tut mir leid, ich kann dir nicht folgen 😕

    http://pages.cs.wisc.edu/~driscoll/typename.html
    Bitte vollständig lesen und verstehen. Wichtige Lektion.

    Außerdem in Zukunft bitte den dritten Link in meiner Signatur befolgen. Das hätte eine Menge unnötiges Rätselraten vermieden.



  • wird gemacht 😃



  • Großartiger link, du hattest recht 👍 Danke


Anmelden zum Antworten