web-dev-qa-db-ja.com

参照メンバーの初期化には一時変数C ++が必要です

struct Div
{
   int i;
   int j;
};   

class A
{
    public:
             A();
             Div& divs;
};

私のコンストラクター定義には、次のものがあります

A::A() : divs(NULL)
{}

次のエラーが発生します。

  Error72 error C2354: 
  'A::divs' : initialization of reference member requires a temporary variable 
13
aajkaltak

何かを参照するには、参照を初期化する必要があります。何も参照できないため、デフォルトでクラスを作成することはできません(他の人が示唆しているように、グローバルな「null」値を定義しない限り)。以下を参照するには、Divが指定されたコンストラクターが必要です。

explicit A(Div &d) : divs(d) {}

「null」にできるようにする場合は、参照ではなくポインタが必要です。

33
Mike Seymour

divsは参照であり、ポインターではありません。 NULLに設定することはできません。ある種の実際のオブジェクトを指している必要があります。ここで行う最善の方法は、Divの静的/グローバルインスタンスを任意に「NullDiv」として定義し(その値を使用する可能性が低いものに設定する)、divをそれに初期化することです。このようなもの:

struct Div
{
   int i;
   int j;
};   

Div NULL_DIV = { INT_MAX, INT_MAX };

class A
{
    public:
             A();
             Div& divs;
};


A::A() : divs(NULL_DIVS)
{
}

または、代わりに、divを参照ではなくポインタにします。

*デフォルトではコンパイラーがcosntrefをnon-constrefに割り当てることを許可しないため、constnessをキャストしない限り、const参照を使用できないことに注意してください。

12

1つは、NULL参照を持つことはできません。次に、クラス内のすべての変数参照は、構築時に初期化する必要があります。

8
jldupont

「英語」の場合:参照は何かを指します。 nothing(null)を参照することはできません。そのため、参照はポインタよりも安全に使用できます。

6
Abel

参照は何かを参照する必要があります。 C++言語にはnull参照のようなものはありません。メンバーに値がない場合は、ポインター、またはboost::optionalまたはそのようなタイプである必要があります。

有効なオブジェクトを参照するには、参照を初期化する必要があります。

3
jalf

参照が何かを指すように初期化されると、それを他の何かを指すように変更することはできないことに注意してください。これが望ましい動作でない場合は、代わりにポインタまたはオブジェクトのコピーを使用する必要があります。

3
qid

コンパイラメッセージは、言語の観点からは意味をなさないメッセージの1つですが、コンパイラの内部動作、つまり内部ロジックが動作するシーケンスを明らかにします。

あなたの場合、参照を初期化するために右辺値(NULL)を使用しています。このような初期化が許可されると、右辺値は一時オブジェクトに変換され、参照がバインドされます。そのため、コンパイラはすぐにそれを認識し、診断メッセージでその事実を通知しました。

ただし、実際には、このようなトリックはconst参照に対してのみ許可されているため、この場合、参照はconstではないため、コードは壊れています。また、コード内のstruct参照は、NULL右辺値(整数型)で初期化できないため、その理由でも壊れています。

しかし、コンパイラのメッセージはかなり誤解を招くものです。メッセージのテキストは、一時オブジェクトでメンバー参照を初期化することは違法であることを暗示しているようです。実際、これはC++では合法です(上記の問題が修正された後)が、意味がありません。しかし、私は、不正な形式のコードに少なくともいくつかのエラーメッセージが付随していれば、誰にとっても問題ないはずです...

3
AnT

簡潔でシンプル:

参照をNULLにすることはできません。

2
Marcin
class A
{
    Div & ref(Div div) { return div; }
    public:
       A() : divs(ref(Div())) {};
       Div& divs;
};
1
konstantin314

「divs」変数を初期化してみてください。 「何もない」を参照する参照を持つことはできません。

ここを見てください:

http://msdn.Microsoft.com/en-us/library/bbt3ewya%28VS.80%29.aspx

これが少し役立つことを願っています!

1
Andy M

他の投稿に記載されているように、参照(Div&)をnullにすることはできません。したがって、実行できる最も簡単な変更は、コンストラクターで参照を提供し、参照メンバーを初期化することです。このような、

class A
{
    public:
             A(Div& inDivs);
             Div& divs;

};

public A::A( Div& inDivs )
: divs( inDivs )
{}
1
Phillip Ngan

私は提案します:

class A{
    std::deque<object*>& que = *(std::deque<object*> *)0;
    // ...
    // Of course `que` is to  be assigned valid deque before using it - just like pointers...
};
0
Bretzelus