abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    včera 15:33 | Komunita

    Po 20 letech a 17 otevřených (open source) krátkých filmech Blender Studio oznámilo plán na svůj první celovečerní film. Cílem samozřejmě není jenom nový otevřený film, ale především vývoj a vylepšení otevřených nástrojů pro spolupráci napříč celým procesem a vytvoření otevřené příručky (playbook) pro filmovou produkci ve velkém měřítku s informacemi, které jsou obvykle dostupné pouze uvnitř komerčních studií, a pomoci tak nezávislým tvůrcům překonat technické a organizační bariéry.

    Ladislav Hagara | Komentářů: 0
    včera 05:00 | Nová verze

    Byla vydána nová verze 26.6.25 svobodného multiplatformního video editoru Shotcut (Wikipedie) postaveného nad multimediálním frameworkem MLT. Shotcut je vedle zdrojových kódů k dispozici také ve formátech AppImage, Flatpak a Snap.

    Ladislav Hagara | Komentářů: 0
    26.6. 14:44 | IT novinky

    Apple bez varování odstranil ze svého obchodu sociální síť VKontaktě i další aplikace skupiny VK, jako je VK Music nebo VK Video [Novinky.cz].

    Ladislav Hagara | Komentářů: 13
    26.6. 14:22 | IT novinky

    V dubnu loňského roku představený poštovní klient Notion Mail bude 22. září ukončen.

    Ladislav Hagara | Komentářů: 3
    26.6. 04:33 | Komunita

    Konference OpenAlt 2026 hledá přednášející. Proběhne o víkendu 7. a 8. listopadu na půdě Fakulty informačních technologií VUT v Brně. Témata konference jsou: Otevřený a svobodný software, IoT a Hnutí tvůrců, Vzdělávání, Bezpečnost a soukromí, Otevřená společnost, komunity a data, OpenMobility a další.

    Ladislav Hagara | Komentářů: 0
    26.6. 04:22 | IT novinky

    Společnosti OpenAI a Broadcom oznámily čip optimalizovaný pro AI pojmenovaný Jalapeño.

    Ladislav Hagara | Komentářů: 0
    25.6. 20:22 | Nová verze

    Deno (Wikipedie), běhové prostředí (runtime) pro JavaScript, TypeScript a WebAssembly, bylo vydáno v nové verzi 2.9. Hlavní novinkou je deno desktop pro převod Deno projektu na desktopovou aplikaci. Jedná se o alternativu k frameworkům Electron nebo Tauri.

    Ladislav Hagara | Komentářů: 2
    25.6. 15:44 | IT novinky

    Od zítra jsou Datové schránky oficiálně na nové adrese datovka.gov.cz. Adresa mojedatovaschranka.cz zůstává funkční do 27. srpna 2026, následně budou uživatelé automaticky přesměrováni na datovka.gov.cz.

    Ladislav Hagara | Komentářů: 3
    25.6. 13:44 | Nová verze

    Dolphin (Wikipedie), tj. open source multiplatformní emulátor herních konzolí GameCube a Wii od Nintenda, byl vydán ve verzi 2606. S podporou Game Boy Playeru.

    Ladislav Hagara | Komentářů: 0
    25.6. 11:11 | Zajímavý software

    Vasudeva Kamath představil utilitu debvulns, alternativu k nativní utilitě debsecan, pro výpis zranitelností v Debianu. Navíc má především možnost výstupu ve strukturovaných formátech JSON a CSV. V plánu je exportér pro Prometheus.

    Ladislav Hagara | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (11%)
     (7%)
     (2%)
     (16%)
     (31%)
     (4%)
     (6%)
     (2%)
     (15%)
     (26%)
    Celkem 2001 hlasů
     Komentářů: 30, poslední 3.4. 20:20
    Rozcestník


    Dotaz: c++ templates and overloading

    25.2.2010 16:46 ::: | skóre: 14 | blog: e_lama
    c++ templates and overloading
    Přečteno: 488×
    Zdavim, mam nasledujici 2 soubory (a.cpp a b.cpp). Jediny rozdil je ze v b.cpp jsem presunul string_t a string_traits do vlastniho jmenneho prostoru. Pritom a.cpp jde zkompilovat (gcc) bez problemu, ale b.cpp skonci s chybou:
    /usr/lib/gcc/3.4.4/include/c++/bits/stl_function.h: In member function `bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = xxx::string_t]':
    b.cpp:54:   instantiated from here
    /usr/lib/gcc/3.4.4/include/c++/bits/stl_function.h:227: error: no match for 'operator<' in '__x < __y'
    
    Zajimavy je ze yyy::less funguje ale std::less ne. Pritom jsem yyy::less vytvoril jako kopii std::less...

    a.cpp:
    #include <boost/mpl/bool.hpp>
    #include <boost/utility/enable_if.hpp>
    #include <functional>
    
    namespace yyy
    {
      template<typename _Tp>
        struct less : public std::binary_function<_Tp, _Tp, bool>
        {
          bool
          operator()(const _Tp& __x, const _Tp& __y) const
          { return __x < __y; }
        };
    }
    
    struct string_t { };
    
    template <typename string_type_>
    struct string_traits;
    
    template <>
    struct string_traits<string_t>
    {
            typedef string_t string_type;
    };
    
    template <typename A, typename B>
    struct both_exist: public boost::mpl::true_ {};
    
    template <typename T, typename U>
    inline
    typename boost::enable_if
    <
            both_exist
            <
                    typename string_traits<T>::string_type,
                    typename string_traits<U>::string_type
            >,
            bool
    >::type operator < (const T &str1, const U &str2)
    { }
    
    int main()
    {
            yyy::less<string_t> cmp;
            std::less<string_t> cmp1;
            string_t a;
            string_t b;
            cmp(a, b);
            cmp1(a, b);
    }
    
    
    b.cpp:
    #include <boost/mpl/bool.hpp>
    #include <boost/utility/enable_if.hpp>
    #include <functional>
    
    namespace yyy
    {
      template<typename _Tp>
        struct less : public std::binary_function<_Tp, _Tp, bool>
        {
          bool
          operator()(const _Tp& __x, const _Tp& __y) const
          { return __x < __y; }
        };
    }
    
    namespace xxx {
    
            struct string_t { };
    
            template <typename string_type_>
            struct string_traits;
    
            template <>
            struct string_traits<string_t>
            {
                    typedef string_t string_type;
            };
    
    }
    
    template <typename A, typename B>
    struct both_exist: public boost::mpl::true_ {};
    
    template <typename T, typename U>
    inline
    typename boost::enable_if
    <
            both_exist
            <
                    typename xxx::string_traits<T>::string_type,
                    typename xxx::string_traits<U>::string_type
            >,
            bool
    >::type operator < (const T &str1, const U &str2)
    { }
    
    int main()
    {
            yyy::less<xxx::string_t> cmp;
            std::less<xxx::string_t> cmp1;
            xxx::string_t a;
            xxx::string_t b;
            cmp(a, b);
            cmp1(a, b);
    }
    
    

    Řešení dotazu:


    Odpovědi

    25.2.2010 17:39 Sinuhet | skóre: 31
    Rozbalit Rozbalit vše Re: c++ templates and overloading
    Mrvi vam to boost. Kdyz ho vyhodite (ve vasem priklade je stejnak zbytecny), tak se to zkompiluje.
    25.2.2010 18:11 ::: | skóre: 14 | blog: e_lama
    Rozbalit Rozbalit vše Re: c++ templates and overloading
    Diky za tip. Zjistil jsem ze boost includuje <utility> a to vytvari v std "operator <" pro porovnani std::pair. Tak jsem vyzkousel pridat "operator <" i do yyy:
    namespace yyy {
            class x;
            inline bool operator < (x const &a, x const &b) { }
    }
    
    a dela me to stejnou chybu i s yyy::less. Takze zrejme ten muj "operator <" neni pristupny v zadnym namespace kde uz existuje jiny "operator <".

    Nejak to nechapu... chapal bych kdyby to muj operator prekrylo vzdycky, ale proc to dela jenom kdyz je string_t a string_traits v xxx ??
    25.2.2010 18:44 Sinuhet | skóre: 31
    Rozbalit Rozbalit vše Re: c++ templates and overloading
    25.2.2010 18:53 ::: | skóre: 14 | blog: e_lama
    Rozbalit Rozbalit vše Re: c++ templates and overloading
    diky, uz jsem to taky dohledal. Takze je to vlastnost a ten "univerzalni operator <" (prispevek dole) asi nijak neudelam?
    25.2.2010 18:48 ::: | skóre: 14 | blog: e_lama
    Rozbalit Rozbalit vše Re: c++ templates and overloading
    tak jsem zjistil ze kdyz ten template operator < presunu do xxx tak to funguje.

    Problem je (see http://en.wikipedia.org/wiki/Argument_dependent_name_lookup), ze napr pri pouziti yyy::less, gcc nejdriv najde yyy::operator<, potom prohleda namespacy asociovany s argumentama a najde xxx::operator<, a root namespace uz neprohledava...

    Tak nevim. Je tohle vlastnost nebo chyba ? A je teda mozny udelat operator <, ktery by fungoval na vsechny string tridy co maji string_traits, at uz jsou v jakymkoli jmennym prostoru ?
    25.2.2010 18:59 Sinuhet | skóre: 31
    Rozbalit Rozbalit vše Re: c++ templates and overloading

    Co by "univerzalni" operator< mel delat? To je problem kazde implementace stringu, aby mela i svoji definici porovnani, ktera bude ve stejnem namespacu, takze vsechno bude fungovat, jak ma.

    25.2.2010 19:20 ::: | skóre: 14 | blog: e_lama
    Rozbalit Rozbalit vše Re: c++ templates and overloading
    moje predstava byla ze bych mel nekolik typu stringu, napr std::string alokovany na halde, potom nejaka vlastni trida pro retezce jen na zasobniku, a mozna i dalsi kombinace...

    Ke kazdymu bych udelal string_traits, kde by byly funkce begin() a end() ktery vrati ukazatele na zacatek/konec retezce a "operator <" bych potom mohl pouzit na porovnavani ruznych trid stringu...

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.