Verschachtelte Templates, using und typename.



  • Hallo Leute,

    ich habe folgenden Code. Wie ihr der folgenden Fehlermeldung entnehmen könnt, wird der Code nicht von g++ in der Version 6.1 akzeptiert. Mir ist aber unklar, wie der Code genau aussehen müsste, damit es klappt. Vielleicht kann mir einer von euch auf die Sprünge helfen. Danke schon einmal im Voraus.

    template <class container_t>
    struct traits_t;
    
    template <class _element_t, std::size_t n>
    struct traits_t<std::array<_element_t, n>>
    {
        static constexpr auto size = std::tuple_size<std::array<_element_t, n>>::value;
    
        template <std::size_t i>
        using element_t = typename std::tuple_element<i, std::array<_element_t, n>>::type;
    };
    
    template <class... element_ts>
    struct traits_t<std::tuple<element_ts...>>
    {
        static constexpr auto size = std::tuple_size<std::tuple<element_ts...>>::value;
    
        template <std::size_t i>            
        using element_t = typename std::tuple_element<i, std::tuple<element_ts...>>::type;
    };
    
    template <std::size_t i, class container_t>
    using container_element_t = typename traits_t<container_t>::element_t<i>;
    
    expected »;« before »<« token using container_element_t = typename traits_t<container_t>::element_t<i>;
    

    Der Fehler bezieht sich auf Zeile 23. Auf die letzte öffnende Klammer vor i. Die farbliche Hervorhebung der Fehlermeldung ging beim Kopieren leider verloren.

    MFG

    Martin



  • Es muss...

    template <std::size_t i, class container_t>
    using container_element_t = typename traits_t<container_t>:: template element_t<i>;

    lauten. Genauso wie man dem Compiler mitteilen muss, dass es sich um einen Typ handelt, muss man ihm auch sagen, dass es ein Template ist.


Log in to reply