jeudi 28 mars 2019

The following code, codifiying an algebraic-group-type sometimes doesn't compile

I'm working on a modelling a algebraic group on C++, over a class of modular integers (simpliying):

    template<unsigned int N>
    struct modint_t {
    private:
       unsigned int m_i{};
    // now I implement all operators of int except those about bitwise
    public:
    // the three constructors by default
    // explicit constructor from ints
    //
    // operator <  same as between integers but only in their range
    // operator >  These comparators are not agreed with the operations
    // operator <= of the ring of modular integers.
    // operator >= But they are helping with the work. 
    // operator == it fully agrees with the modular integers ring
    // operator != it fully agrees with the modular integers ring
    // operator = Both assignations by default
    //
    // binary operators +,+=,-,-=,*,*=,^,^= (the two las are 
    //                                       exponentiation)
    // unary operators (or like operators) -, ~, !, CB,CBm1,mCB,mCBm1
    //                                     inv, invert
    // ~ and CBm1 are de complement to the Module minus 1
    // a.mCBm1() := a = a.CBm1(); a.mCBm1 := a = ~a;  
    // CB and - are the complement to de Module
    // a.mCB() := a = a.CB(); a.mCB() == !a;
    // a.inv()*a == modint(int(1)) == a*a.inv();
    // a.invert() := a = a.inv();
    //
    // explicit operator int() return a copy of m_i;
    // 
    // operators++(),operator--(),operators++(int),operator--(int)
    // next()const ,prev()const ,mnext(),mprev()
    // the increment and decrement are circulars and they are agree with
    // comparators operators
    };

Then I code a modint_cartprod_t, a type that represent a ring of cartesian product of several modular integer rings (very much simplified):

    template<unsigned N_0,unsigned ... N_s>
    struct modint_cartprod_t{
        using base_t = std::tuple<modint_t<N_0>,modint<N_s>...>;
    private:
        base_t elem{};
    // all idem as in modint_t template, it is a ring. Some more
    // constructors from list of integers etc. Helping classes and 
    // functions. I use fold expresions, except for prev(), next()... that 
    // I use an static_for class with recursion in the operator()
    };
    // concat of modint_cartprod_t s
    // extern product of integer and one modint_t or modint_cartprod_t
    // to modelling an algebraic structure of module.

As I want modelling others groups than the direct product of cyclic groups, I code a class without data member, only static operations to conform other operations, as, for example, dihedral groups (semi direct products) or quaternion group (by cohomology) and much others.

    template<group_name gn,unsigned N_0,unsigned ... N_s>
    struct {
        static modint_cartprod_t 
        direct_product(
            modint_cartprod_t a,modint_cartprod_t a
        ) {return (a+b);}

        static modint_cartprod_t 
        semi_direct_product(
            modint_cartprod_t a,modint_cartprod_t a
        ) {/* operations with an action */}

        modint_cartprod_t operator(modint_cartprod_t,modint_cartprod_t);
        // intern operation

        // neutre() and others if the neutre element exists 
        // operator-() and others if the inverse of the intern operation
        // exists
    }

The problem is in this point, for :

    template<unsigned N>
    struct binop_t<group_name::Dih,uint,2,N> {
    static constexpr
modint_cartprod_t Dih_product(modint_cartprod_t a,modint_cartprod_t b) 
{
    const UIntType i{a.get_int<0>()};/// Module 2 Error HERE
    const UIntType k{a.get_int<1>()};/// Module N Error HERE

    const UIntType j{b.get_int<0>()};/// Module 2 Error HERE
    const UIntType m{b.get_int<1>()};/// Module N Error Here

    if (j%2_u8==0) {
        const modint_cartprod_t R{i+j,m+k};
        return R;
    } else {
        const modint_cartprod_t R{i+j,m+(N-k)};
        return R;
    }
}
    };

This indicated function doesn't compile with the following error message from compiler mingw gcc8.2 (nuwen distro):

C:\Windows\system32\cmd.exe /C C:/MinGW/bin/make.exe -j8 SHELL=cmd.exe -e -f Makefile "----------Building project:[ grupos_finitos - Debug ]----------" make.exe[1]: Entering directory 'C:/Users/julia/Dropbox/GitHub/tfg_grupos_finitos/grupos_finitos' C:/MinGW/bin/g++.exe -c "C:/Users/julia/Dropbox/GitHub/TFG_GruposFinitos/src/FiniteGroups/main.cpp" -g -O0 -Wall -std=c++17 -o ./Debug/up_up_TFG_GruposFinitos_src_FiniteGroups_main.cpp.o -I. -I. In file included from C:/Users/julia/Dropbox/GitHub/TFG_GruposFinitos/src/FiniteGroups/main.cpp:11: C:/Users/julia/Dropbox/GitHub/TFG_GruposFinitos/src/FiniteGroups/binop_t.hpp: In static member function 'static constexpr tfg::binop_t<(tfg::group_name)6, unsigned char, 2, N>::modint_cartprod_t tfg::binop_t<(tfg::group_name)6, unsigned char, 2, N>::Dih_product(tfg::binop_t<(tfg::group_name)6, unsigned char, 2, N>::modint_cartprod_t, tfg::binop_t<(tfg::group_name)6, unsigned char, 2, N>::modint_cartprod_t)': C:/Users/julia/Dropbox/GitHub/TFG_GruposFinitos/src/FiniteGroups/binop_t.hpp:543:29: error: expected primary-expression before ')' token UIntType i = a.get_int<0>();/// Module 2 ^ C:/Users/julia/Dropbox/GitHub/TFG_GruposFinitos/src/FiniteGroups/binop_t.hpp:544:34: error: expected primary-expression before ')' token const UIntType k {a.get_int<1>()};/// Module N ^ C:/Users/julia/Dropbox/GitHub/TFG_GruposFinitos/src/FiniteGroups/binop_t.hpp:546:24: error: expected primary-expression before ')' token auto j {b.get_int<0>()};/// Module 2 ^ C:/Users/julia/Dropbox/GitHub/TFG_GruposFinitos/src/FiniteGroups/binop_t.hpp:547:30: error: expected primary-expression before ')' token const auto m {b.get_int<1>()};/// Module N ^ C:/Users/julia/Dropbox/GitHub/TFG_GruposFinitos/src/FiniteGroups/binop_t.hpp: In static member function 'static constexpr tfg::binop_t<(tfg::group_name)10, unsigned char, 2, N>::modint_cartprod_t tfg::binop_t<(tfg::group_name)10, unsigned char, 2, N>::Dic_product(tfg::binop_t<(tfg::group_name)10, unsigned char, 2, N>::modint_cartprod_t, tfg::binop_t<(tfg::group_name)10, unsigned char, 2, N>::modint_cartprod_t)': C:/Users/julia/Dropbox/GitHub/TFG_GruposFinitos/src/FiniteGroups/binop_t.hpp:608:24: error: no match for 'operator+=' (operand types are 'tfg::modint_cartprod_t::modint_idx<1>' {aka 'tfg::modint_t'} and 'int') sr.get_modint<1>() += (N/2); ~~~~~~~~~~~~~~~~~~~^~~~~~~~ In file included from C:/Users/julia/Dropbox/GitHub/TFG_GruposFinitos/src/FiniteGroups/main.cpp:9: C:/Users/julia/Dropbox/GitHub/TFG_GruposFinitos/src/FiniteGroups/modint_t.hpp:202:19: note: candidate: 'const tfg::modint_t& tfg::modint_t::operator+=(const tfg::modint_t&) [with UIntType = unsigned char; UIntType N = 2]' const modint_t & operator += (const modint_t & b) { ^~~~~~~~ C:/Users/julia/Dropbox/GitHub/TFG_GruposFinitos/src/FiniteGroups/modint_t.hpp:202:19: note: no known conversion for argument 1 from 'int' to 'const tfg::modint_t&' In file included from C:/Users/julia/Dropbox/GitHub/TFG_GruposFinitos/src/FiniteGroups/main.cpp:11: C:/Users/julia/Dropbox/GitHub/TFG_GruposFinitos/src/FiniteGroups/binop_t.hpp: In static member function 'static constexpr tfg::binop_t<(tfg::group_name)35, UIntType, p, q>::modint_cartprod_t tfg::binop_t<(tfg::group_name)35, UIntType, p, q>::GDih_action(tfg::binop_t<(tfg::group_name)35, UIntType, p, q>::modint_cartprod_t, tfg::binop_t<(tfg::group_name)35, UIntType, p, q>::modint_cartprod_t)': C:/Users/julia/Dropbox/GitHub/TFG_GruposFinitos/src/FiniteGroups/binop_t.hpp:666:33: error: expected primary-expression before ')' token const UIntType i{a.get_int<0>()}; ^ C:/Users/julia/Dropbox/GitHub/TFG_GruposFinitos/src/FiniteGroups/binop_t.hpp:667:33: error: expected primary-expression before ')' token const UIntType j{a.get_int<1>()}; ^ C:/Users/julia/Dropbox/GitHub/TFG_GruposFinitos/src/FiniteGroups/binop_t.hpp:669:33: error: expected primary-expression before ')' token const UIntType k{b.get_int<0>()}; ^ make.exe[1]: * [grupos_finitos.mk:97: Debug/up_up_TFG_GruposFinitos_src_FiniteGroups_main.cpp.o] Error 1 make.exe: * [Makefile:5: All] Error 2 make.exe[1]: Leaving directory 'C:/Users/julia/Dropbox/GitHub/tfg_grupos_finitos/grupos_finitos' ====26 errors, 10 warnings====

I don't understand:

error: expected primary-expression before ')' token UIntType i = a.get_int<0>();/// Module 2 ^ The code of get_int<>() is:

    template<typename UIntType,UIntType N_0,UIntType ... N_s>
    struct modint_cartprod_t {
        using std::get;
        template<size_t k>
    inline constexpr
    UIntType
    get_int() const {
        return UIntType(get<k>(elem));
    }
    };

In others binop of groups this function compiles without signal of error.

I don't know that I can do to compile the code. I don't know really where is the error.

I you need the code, say me, and I put in GitHub all the code and I give you the link.

Aucun commentaire:

Enregistrer un commentaire