2011-02-06 4 views
1

void *変数に別名を付けて、別の名前で使用できるようにしたい。これは、ポインタ(p)を何かに設定でき、エイリアス化された変数(pp)も同じアドレスに設定されることを意味します。例えばvoid * pointerへの定数参照

class foo { 
    private: 
    static void* p; //I just happen to need this for static variable 
    static const void*& pp; 
}; 

//in cpp: 
const void*& foo::pp = foo::p; 

GCCが不平を言っている:私はあなたがここに欲しいことへのconst参照であると考えている間

error: invalid initialization of reference of type 'const void*&' from expression of type 'void*'

+0

あなたの宣言は、あなたの定義と一致していません許可されます。後者はタイプ 'constのボイドのであるのに対し、(参照のconst voidへのポインタに)' *前者はタイプ 'constのボイドのあります&*& const'(const voidへのポインタへの定数参照)で、どちらも "voidへのポインタ"と互換性がありません。 –

+0

Adam Rosenfield:入力エラーです。実際のコードは 'const void *&'で、まだエラーです。 – Pubby

+1

リファレンスである静的メンバーを使用できますか?また、私はあなたが最初にvoidポインタを使う必要がある理由をもう一度考えるよう勧めます。これは、通常、悪い設計の兆候です。 – Dima

答えて

9

あなたはすなわちconstの無効を設定し、やろうとしているもの* &無効を指すように*それは法的、十分に無害でなければなりませんように思えるが、それはないが、それは違法です正当な理由で参照は参照するもののエイリアスに過ぎないことに注意してください。今、私はこれがあると我々はそれが

につながるものを見るように

const void* & foo::pp = foo::p; //不法:

は、私たちがこれを行うことができます言うfooのよう

const char *x = "Hello world";

を:: ppはconstへのポインタです。したがって、xを指すことができます:

foo::pp = x; //法的にはconst vを指すことができますoid * to const memory

ただし、ppはpへの参照であるため、pはxを指します。

だから今、私はこれを行うことができます:私はconstのあるXを変更しようとしていて、もちろん違法でなければなりません

memset(foo::p, 8, 'X');

あなたがしようとしていることは許可されていません。

void * const& foo::pp = p;

1

const void *&は、constのボイドポインタへの参照として解釈されますvoidポインタ。代わりにこれを試してみてください:

void * const &foo::pp = foo::p; 
+0

あなたはそれを後方に持っていると思います。 const void *&は定数でないvoidへの定数参照でなければなりません。あなたのコードは私にfoo:ppを変更させません。 – Pubby

+1

@ペペ:はい、 'foo :: pp'は変更できません。あなたがそれを変更できるようにしたいのであれば、なぜあなたは 'const'を必要としますか? 'void *&foo :: pp = foo :: p'にしてください。 – casablanca

+1

参照を別のオブジェクトを参照するように変更することはできません。あなたは実際にあなたが正しい答えを与える人々に-1を与えることを望んでいるものについて非常に曖昧です。 – CashCow

関連する問題