Подтвердить что ты не робот

Инициализация ссылочного элемента требует временной переменной С++

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 
4b9b3361

Ответ 1

Ссылка должна быть инициализирована, чтобы ссылаться на что-то; он не может ссылаться ни на что, поэтому вы не можете построить по умолчанию класс, содержащий один (если, как другие, вы не указываете, вы определяете глобальное значение "null" ). Вам понадобится конструктор, которому присваивается Div для ссылки на:

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

Если вы хотите, чтобы он был "нулевым", вам нужен указатель, а не ссылка.

Ответ 2

divs - это ссылка, а не указатель. Вы не можете установить его в NULL, он должен указывать на какой-либо конкретный объект. Самое лучшее, что можно сделать здесь, это, вероятно, определить статический/глобальный экземпляр Div, который вы произвольно определяете как "Null Div" (установите его значение на то, что вы вряд ли когда-либо будете использовать) и инициализируйте 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)
{
}

Или, альтернативно, просто сделайте divs указателем вместо ссылки.

* Обратите внимание, что вы не можете использовать ссылку на const, если вы не отбросили константу, потому что по умолчанию компилятор не позволит вам назначить cosnt ref для не-const ref.

Ответ 3

Во-первых, вы не можете иметь ссылку NULL. Во-вторых, все ссылки переменных в классе должны быть инициализированы во время построения.

Ответ 4

В "английском": ссылка ссылается на что-то. Он не может ссылаться ни на что (null). Вот почему ссылки более безопасны для использования тогда указателей.

Ответ 5

Ссылки должны ссылаться на что-то. Нет такой вещи, как нулевая ссылка на языке С++. Если член может не иметь значения, то он должен быть указателем или boost::optional или некоторым типом.

Ссылка должна быть инициализирована для ссылки на действительный объект.

Ответ 6

Имейте в виду, что как только ссылка инициализируется, чтобы указать на что-то, вы не можете изменить ее, чтобы указать на что-то еще. Если это не является желаемым поведением, вы должны использовать указатель или копию объекта.

Ответ 7

Сообщение компилятора является одним из тех сообщений, которые не имеют смысла с точки зрения языка, но показывают внутреннюю работу компилятора, последовательность, в которой работает его внутренняя логика.

В вашем случае вы используете rvalue (NULL) для инициализации ссылки. Когда такая инициализация разрешена, значение rvalue преобразуется во временный объект, к которому привязка будет привязана. Итак, компилятор сразу понял это и сообщил вам об этом с помощью диагностического сообщения.

В действительности, трюк, подобный этому, разрешен только для ссылок const, поэтому ваш код сломан, так как ссылка в нашем случае не const. Кроме того, ссылка struct, как и в вашем коде, не может быть инициализирована с помощью NULL rvalue (которая имеет встроенный тип), поэтому она по этой причине также повреждена.

Сообщение компилятора, скорее всего, вводит в заблуждение. Текст сообщения, по-видимому, подразумевает, что было бы незаконно инициализировать ссылки на элементы с временными объектами. На самом деле, это законно в С++ (как только указанные проблемы исправлены), хотя это не имеет смысла. Но, я думаю, когда некорректный код сопровождается по крайней мере некоторым сообщением об ошибке, все должно быть хорошо для всех...

Ответ 8

Обычный и простой:

Ссылка никогда не может быть NULL.

Ответ 9

Вам следует попробовать инициализировать переменную "divs". Вы не можете ссылаться на "ничего"...

Посмотрите здесь:

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

Надеюсь, что эта помощь немного!

Ответ 10

Как отмечено в других сообщениях, ссылки (Div &) не могут быть нулевыми. Поэтому самое простое изменение, которое вы можете сделать, это предоставить ссылку в конструкторе и инициализировать ваш ссылочный элемент. Как это,

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

};

public A::A( Div& inDivs )
: divs( inDivs )
{}

Ответ 11

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

Ответ 12

Я бы предложил:

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...
};