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 einusing 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