GMP compile failure
Marc Glisse
marc.glisse at normalesup.org
Sat Dec 29 02:00:58 CET 2007
On Fri, 28 Dec 2007, Tim Hockin wrote:
> This (simplified) C++ snippet does not compile. But it doesn't give
> me the possibly-expected undefined operator error:
>
> mpz_class foo(123);
> mpz_class bar = foo & 0x107;
[...]
> /usr/include/gmpxx.h:3413: error: invalid conversion from 'const long
> int' to 'const __mpz_struct*'
> /usr/include/gmpxx.h:3413: error: initializing argument 3 of 'static
> void __gmp_binary_and::eval(__mpz_struct*, const __mpz_struct*, const
> __mpz_struct*)'
Whereas just "foo & 0x107;" compiles fine.
> I can make it build by explicitly casting the int to mpz_class, but
> that's kind of a pain. I am converting a codebase to use GMP, and
> this is causing lots of errors.
You can also modify struct __gmp_binary_and in gmpxx.h to (untested):
struct __gmp_binary_and
{
static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v)
{ mpz_and(z, w, v); }
static void eval(mpz_ptr z, mpz_srcptr w, unsigned long int i)
{
mpz_t temp;
mpz_init_set_ui(temp,i);
mpz_and(z, w, temp);
mpz_clear(temp);
}
static void eval(mpz_ptr z, unsigned long int i, mpz_srcptr w)
{
mpz_t temp;
mpz_init_set_ui(temp,i);
mpz_and(z, temp, w);
mpz_clear(temp);
}
};
But if you want to distribute your code, that is not a solution.
> Is there any answer to this, other than "cast it"?
I am not familiar enough with the code to know the right answer.
> why such a cryptic error?
Getting non-cryptic error messages in C++ is... hard. Here the code goes
through many inline functions to try and avoid any useless copy and the
type problem is detected only in the middle.
--
Marc Glisse
More information about the gmp-discuss
mailing list