2011-10-25 19 views
4

gccバージョン4.5.0を使用しています。次の簡単な例を使用して、私は二重の*からのエラー無効な変換を得るために引き受けることのconstにするダブルgccエラー:double *からconst doubleへの無効な変換

#include <iostream> 
using namespace std; 

void foo(const double *a) 
{ 
    cout<<a[0]*2.<<endl; 
} 

int main() 
{ 
    double *a=new double[2]; 
    a[0]=1.; 
    a[1]=2.; 
    foo(a); 
    return 1; 
} 

は、なぜそれがエラーなしでコンパイルされますか*?第二の例について

#include<iostream> 
using namespace std; 

void foo(const double **a) 
{ 
cout<<a[0][0]*2.<<endl; 
} 


int main() 
{ 
    double **a=new double*[2]; 
    a[0]=new double[2]; 
    a[1]=new double[2]; 
    a[0][0]=1.; 
    foo(a); 
    cout<<a[0][0]<<endl; 
    return 1; 
} 

は(溶液:

反例は似て、次の1です。FOOとFOOを定義(定数二重* constの* a)のジャック・エドモンズのコメントのおかげで、これはエラーを説明しますメッセージ)

+1

変換が無効なのはなぜですか? – luiscubal

+0

double ** aを使用した場合に変換エラーが発生するためです。 –

答えて

8

一般的に、CおよびC++では暗黙的に「定数」を増やすことはできますが、「定数は小さくする」ことはできません。したがって、constオブジェクトを受け取る関数に非constオブジェクトを渡すことは許されています。

基本的に、メソッド宣言のconstパラメータは、パラメータを変更しないことを約束する関数の方法です。

あなたはより多くの情報については、この質問を見ることができます:あなたはそれを伝える多くの答えを持っていたとしてQuestion about const_cast in c++

+0

私が奇妙に感じたのは、より複雑な関数でこのエラーメッセージを受け取ったということでした。その関数も配列を操作していないが、単純な例とは対照的に、コンパイラはこのエラーを送信する。したがって、コンパイラがどの基準を使用しているのか不思議でした。 –

+0

具体的にどのようなエラーが発生しましたか? –

+0

prog.cpp:585:55:エラー: 'double ***'から 'const double ***'への無効な変換 prog.cpp:585:55:エラー: 'foo(uint、scaling 、uint、double、const double ***、double **) ' –

6

constポインタをとる関数に非constポインタを渡すことができます。あなたはそれが一定性に違反するので、まったく逆のことはできません。

4

constデータ型を初期化できる必要があります。 const double*のパラメータにdouble*を渡しても問題ありません。あなたは呼び出し側で必要なことを行うことができますが、呼び出し先はconstと言ったことを変更することはできません。

エラーと警告が表示されるようになると、別の方法になります。

0

パラメータの型としてdouble *const double *への変換が、有効です。

しかし、あなたの混乱の原因になっているかもしれない、あなたが以前に見たかもしれない奇妙な落とし穴がコンパイルされていません。同様のコードがコンパイルされていないことが分かっていない場合は、この回答をスキップしてください。私はあなたが以前にこれが動作していないと思ったと思った場合に備えて、詳細を追加しています。

時々const型は、const型のパラメータポインタを介してconst型をCALLERに貼り付けることに違反する可能性があります。コンパイルエラーが発生します。コンパイルエラーは、一見して同じ種類の変換のように見えます。たとえば、void bar(const double **a)関数を持っていて、メインにfoo(&a)という名前で呼び出すと、タイプがより一定に見える別の状況のように思えますが、コンパイルエラーが発生するはずです。

この状況の詳細については、questionを参照してください。

関連する問題