Template-Template problem
-
Hi,
hab heute mittag schon paar leute im IRC damit gequaellt aber irgendwie is die Erleuchtung bei mir ausgeblieben -.-die header datei sieht wie folgt aus:
#ifndef PARSER_H #define PARSER_H #include <vector> #include <boost/regex_fwd.hpp> #include <boost/regex.hpp> #include <string> #include <iostream> #include <memory> namespace IRC { class Functor{ public: Functor(){} void operator ()(){ std::cout << "mauahahaha" << std::endl; } }; template<typename T, template<typename ELEM, typename ALLOC = std::allocator<ELEM> >class CONT = std::vector> class RequestParser{ CONT<T> container; public: RequestParser(const T&i) : container(){ container.push_back(i); } RequestParser(){} ~RequestParser(){} void add_item(const T&); void parse(std::string); }; template<typename Action> class ParserItem { boost::regex reg; // evl. sollten die beiden dinger pointer sein Action action; public: ParserItem(const boost::regex &e, const Action &a) : reg(e), action(a){} ParserItem(const std::string &s, const Action &a):reg(s), action(a){} ParserItem(const std::string &s) : reg(s), action(){} ParserItem(const boost::regex &e) : reg(e), action(){} ~ParserItem(){} const boost::regex& get_regex() { return reg; } Action get_action()const { return action; } void make_stuff()const { action();} }; /*************************************************************************************/ // Definition muss wegen Templateparametern hier erfolgen /*************************************************************************************/ template<typename T, template<typename, typename>class CONT> void RequestParser<T, CONT>::add_item(const T& item){ container.push_back(item); } template<typename T, template<typename, typename>class CONT> void RequestParser<T, CONT>::parse(std::string s){ boost::cmatch what; int i =0; /* Wenn ich die schleife als: * for(typename CONT<T>::iterator i = container.begin(); i != container.end(); ++i) * schreibe geht das ganze nicht weil der mir sagt das das template 2 parameter statt einen braucht * und das iterator kein gueltiger member ist */ while(i < container.size()){ if(boost::regex_match(s.c_str(), what, container[i].get_regex())){ container[i].get_action()(); break; } ++i; } } } #endif // PARSER_Hund die "main.cc" zum testen
#include "parser.h" #include <iostream> int main(){ //IRC::Functor action(); IRC::ParserItem<IRC::Functor> item(std::string("was")); // wieso muss ich hier das std::vector mit angeben ... hier sollte doch // der default parameter greifen IRC::RequestParser<IRC::ParserItem<IRC::Functor>, std::vector > parser(item); parser.parse(std::string("muahaha... was geht")); return 0; }Problem ist folgendes ... das ganze kompiliert zwar aber es tut ned so recht was es soll und einige sachen sind mir dabei auch noch nicht ganz klar ... die habe ich im quellcode mit kommentaren versehen....
ach ja und im IRC meinte jemand das das Template-Template zeug bei nem std::vector nicht standart konform ist ... wieso?
hoffe ihr koennt mich ein wenig erleuchten ... danke schonmal fuers lesen

-
template<typename T, template<typename ELEM, typename ALLOC = std::allocator<ELEM> >class CONT = std::vector>
das ist das erste mal, dass ich default parameter in der argumentliste eines template template parameters sehe - und ich bin nicht sicher, ob ich den sinn verstehe. auf jeden fall können std-container zusätzliche parameter (mit geeigneten defaultwerten) haben, so dass ein std::vector keineswegs ein gültiges argument für dein template sein muss. eine bessere variante wäre:
template<class CONT> class RequestParser{ typedef typename CONT::value_type T; typedef typename CONT::allocator_type ALLOC; // ...