2016-07-24 7 views
1

GMPとC++ 11を組み合わせたときのマイナーな問題があります。GMPXXとC++ 11以降を組み合わせる

プログラム例:

#include <gmpxx.h> 

int main() 
{ 
    mpz_class a,b; //ok 
    auto c = a+b; //ok (?) 
    c = 0; //error 
} 

エラーメッセージ:

error: no match for 'operator=' (operand types are '__gmp_expr<__mpz_struct [1], __gmp_binary_expr<__gmp_expr<__mpz_struct [1], __mpz_struct [1]>, __gmp_expr<__mpz_struct [1], __mpz_struct [1]>, __gmp_binary_plus> >' and 'int') 
    c = 0; 
    ^

問題は何ですか?

+2

この場合、 'auto'は式テンプレートでうまく再生されません。 – ildjarn

+0

https://lanbsutter.com/2012/04/03/reader-qa/ https://lanzkron.wordpress.com/2011/02/21/inferring-too-much/ –

+0

にリンクしています。 GMPのドキュメンテーションの "C++ 11"という段落です:https://gmplib.org/manual/C_002b_002b-Interface-Limitations.html –

答えて

1

operator+(mpz_class const&, mpz_class const&)は別のmpz_classを返しますが、中間結果タイプ__gmp_expr<T, U>を返さないためです。

コメントは演算子と関数の結果は、__gmp_expr<T, U>のインスタンスであるsource file

にあります。

...それは mp*_class(「怠け者」の評価)に割り当てられ を取得するときに __gmp_expr<T, U>オブジェクトの

実際の評価が行われているが:これは その評価()メソッドを呼び出すことによって行われます。

あなたがcを取得auto c = a + b;使うようなタイプ__gmp_expr<T, U>のものであり、そのためmp*_classまたは整数はそれに割り当てることができない他のです。

関連する問題