template in argumentlist eines templates



  • Hallo,

    ich weiß nicht genau wie ich ein template in der argumentliste eines template definieren muss.

    Hier der Beispielcode:

    template< class T, class T_Data, class T_List = std::vector<T>, class T_Array = std::vector<T_List> >
    	class TestData
    	{
    	[...]
    	};
    
    template < class TestType , class TestData > //<-- wie wird TestData argument hier korrekt definiert?
    	class TestKlasse
    	{
    [...]
    };
    

    Wie wird es denn richtig gemacht? Ich dachte TestData als template argument für TestKlasse benötigt ebenfalls die Definition seiner eigenen templateargumente aber das funktioniert irgendwie nicht. Also frage ich lieber gleich nach wie es richtig sein muss.

    Vielen Dank iV
    Sam



  • Katachi schrieb:

    Hallo,

    ich weiß nicht genau wie ich ein template in der argumentliste eines template definieren muss.

    Hier der Beispielcode:

    template< class T, class T_Data, class T_List = std::vector<T>, class T_Array = std::vector<T_List> >
    	class TestData
    	{
    	[...]
    	};
    
    template < class TestType , class TestData > //<-- wie wird TestData argument hier korrekt definiert?
    	class TestKlasse
    	{
    [...]
    };
    

    Wie wird es denn richtig gemacht? Ich dachte TestData als template argument für TestKlasse benötigt ebenfalls die Definition seiner eigenen templateargumente aber das funktioniert irgendwie nicht. Also frage ich lieber gleich nach wie es richtig sein muss.

    Vielen Dank iV
    Sam

    Wir können dir nicht sagen wie du es richtig machen musst, weil du nicht gesagt hast was du willst. Du hast hier den Bezeichner TestData für zwei völlig verschiedene Zwecke benutzt. Zum einen als Name für das Klassentemplate, zum Anderen als Parametername für das andere Klassentemplate - die beiden Namen haben aber nicht mit einander zu tun.
    Was willst du erreichen?



  • pumuckl schrieb:

    Wir können dir nicht sagen wie du es richtig machen musst, weil du nicht gesagt hast was du willst. Du hast hier den Bezeichner TestData für zwei völlig verschiedene Zwecke benutzt. Zum einen als Name für das Klassentemplate, zum Anderen als Parametername für das andere Klassentemplate - die beiden Namen haben aber nicht mit einander zu tun.
    Was willst du erreichen?

    Die TestKlasse soll eine teilspezialisierte Templateklasse sein. Die Templateargumente von TestKlasse sollen TestType und explizit die zuvor definierte Templateklasse TestData sein.



  • template < class TestType > 
    class TestKlasse<TestType, TestData<bla, blubb, foo, bar> >//<-- partielle Spezialsierung
        {
    [...]
    };
    

    natürlich muss das TestKlasse-Template dazu vorher zumindest irgendwo zumindest deklariert sein (oder als nichtspezialisiertes template definiert:

    template <class TestType, class DataType>
    class TestKlasse /* { optionale definition } */ ;
    


  • Ah jetzt verstehe ich. Ich glaube ich habe da ein bisl was durcheinandergebracht.
    Werd ich gleich mal ausprobieren. thx



  • ok, es hilft doch noch nicht ganz weiter. Kann ich auch in der Spezialisierung die

    TestData<bla,blubb,foo,bar>

    definition irgendwie undefiniert lassen? Ich möchte TestData als argument noch immer undefiniert lassen.

    Sprich à la

    template TestData<T,T1,T2,T3>

    ich habe jetzt i.ü. die TestKlasse undefiniert gelassen und eine seiner funktionen soll jetzt spezialisiert sein. Die soll jedoch jegliche Definition von TestData annehmen können.

    template < class ThreadType , class ThreadData >
    	class TestKlasse
    	{
    		void	Init(const ThreadData& newdata);
    	};
    
    	template < class ThreadType , class ThreadData >
    	void TestKlasse< ThreadType,ThreadData >::Init(const ThreadData& newdata);
    //Und jetzt die spezialisierte Funktion wobei TestData trotzdem als template undefiniert sein soll..geht das überhaupt? 
    	template < class ThreadType >
    	void TestKlasse< ThreadType, template TestData<class T, class T2>> >::Init(const ThreadData& newdata)
    	{}
    

    Ob das so valid ist weiß ich nicht, aber genau das benötige ich. Macht das sinn?


  • Mod

    Exakt so wie du das willst, fällt mir kein Weg ein. Aber man kann Templates als Template-Parameter haben:

    template < class T1, class T2, class T3, class T4 >
    class TestData
    {
    };
    
    template < class T1 , template<class,class,class,class> class T2 >
    class TestKlasse  {
    };
    
    TestKlasse<int,TestData > foo;   // Geht!
    
    TestKlasse<int,int > bar;        // Geht nicht!
    

    Das geht dann aber mit jedem vierparametrigen Template, nicht nur mit TestData.

    Etwas ausführlicher wird das beispielsweise hier erklärt:
    http://www.informit.com/articles/article.aspx?p=376878



  • Danke SeppJ. Das ist ganz genau das was ich gesucht habe! Danke auch für den Link.


Anmelden zum Antworten