Von Templates und Spezialisierungen



  • Guten Tag, ich hab hier ein kleines Problem mit Template-Spezialisierungen. Könnte ihr da wohl bitte mal einen Blick drauf werfen? 😞

    namespace order {
    	struct row_major {};
    	struct column_major {};
    }
    
    namespace detail {
        template< template< typename ContainerType, typename OrderType > class    ArrayType, typename ContainerType, typename OrderType >
    	class array2d_types {
    	public:
                typedef std::size_t size_type;
            };
    
        template< template<typename,typename> class ArrayType, typename ContainerType, typename OrderType >
    	class array2d_base;
    
        template< template<typename,typename> class ArrayType, typename ContainerType >
    	class array2d_base< ArrayType, ContainerType, order::column_major > 
    		: public detail::array2d_types< ArrayType, ContainerType, order::column_major >
    	{};
    
    }
    
    template< typename ContainerType, typename Ordering = order::column_major >
    class array2d : public detail::array2d_base< array2d, ContainerType, Ordering > {
    public:
       typedef size_type bla; // size_type undefiniert, es wird nicht die Spezialisierung von array2d_base getroffen :(
    };
    

    Und vor allem meckert der Compiler da schon, obwohl überhaupt keine Template-Instanziierung von array2d existiert. Was verpeile ich da?



  • Mach aus Zeile 28

    typedef typename detail::array2d_base< array2d, ContainerType, Ordering >::size_type bla;
    

    , dann dürfte es gehen.
    Edit: Oder setz' vor Zeile 28 ein

    using typename detail::array2d_base< array2d, ContainerType, Ordering >::size_type;
    


  • Aber dann muss ich ja alle Typen aus array2d_types (das sind ungestript wesentlich mehr) manuell nach array2d "importieren" 😞



  • Decimad schrieb:

    Aber dann muss ich ja alle Typen aus array2d_types (das sind ungestript wesentlich mehr) manuell nach array2d "importieren" 😞

    Ja, dann wird halt das Typedef ein wenig länger, da hast du Glück gehabt.
    Welcome to the wunderful world of C++-templates.



  • Ich leite jetzt einfach array2d auch nochmal von den array2d_types ab, ist ja eh eine leere Klasse 😃

    Aber jetzt habe ich folgendes Problem:

    template< typename ContainerType, typename Ordering = order::column_major >
    class array2d : public detail::array2d_base< array2d, ContainerType, Ordering >, public detail::array2d_types< array2d, ContainerType, Ordering > {
    private:
    	typedef detail::array2d_base< array2d, ContainerType, Ordering > base;
    }
    

    Das klappt so nicht, weil der name array2d innerhalb des Templates ja für den konkreten Typ steht, komme ich dort irgendwie an das unkonkrete Template heran?

    Edit: hat sich erledigt! ( namespace::array2d verwenden! ) 🙂 Ist ja auch irgendwie logisch


Anmelden zum Antworten