реклама на сайте
подробности

 
 
> Не пойму,что IAR не нравится, Error[Pe158]: expression must be an lvalue or a function designator
WHALE
сообщение Dec 3 2015, 06:59
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



IAR выдает ошибку на такой код(упрощено до минимума)
CODE
class Base
{
public:
Base(){}
};

class Derv1:public Base
{
public:
Derv1():Base(){}
};

class TInterface
{
public:
TInterface()
{
Base* pBase =&Derv1(); /*не работает - Error[Pe158]: expression must be an lvalue or a function designator // */
}
};

int main()
{
TInterface Interface;
while(1);
}

Не понимаю смысла ругани в данном случае. MSVC 2008 ест такой код без проблем
А вот так работает
CODE
class Base
{
public:
Base(){}
};

class Derv1:public Base
{
public:
Derv1():Base(){}
};

class TInterface
{
public:
TInterface()
{

Derv1 dv1;
Base* pBase =&dv1;
}
};
//-----------------------------------------------------------------------------/
int main()
{
TInterface Interface;
while(1);
}


Какого &*% ему надо?


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Dec 3 2015, 07:49
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Я упростил еще сильнее, gcc тоже ругается:
Код
class a
{
};

void test()
{
    a * Tmp = &a();
}

test.cpp:20:18: error: taking address of temporary [-fpermissive]
     a * Tmp = &a();
                  ^
Могу предположить, что область видимости объекта ограничена этим выражением, т.е. в конце выражения объект будет уничтожен, а указатель на него останется. Хотя у вас сообщение совсем о другом. Интересно, что скажет техподдержка?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
WHALE
сообщение Dec 3 2015, 07:57
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



Цитата(Сергей Борщ @ Dec 3 2015, 11:49) *
gcc тоже ругается:
Код
class a
{
};

void test()
{
    a * Tmp = &a();
}

test.cpp:20:18: error: taking address of temporary [-fpermissive]
     a * Tmp = &a();
                  ^

Ну у вас возможно правильная ругань,т.к. действительно создается временный
объект(а он уничтожится по выходу из функции test() ) и делается попытка взять его адрес.
Интересно скомпилировать мой пример в gcc.


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 3 2015, 08:44
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(WHALE @ Dec 3 2015, 10:57) *
действительно создается временный
объект(а он уничтожится по выходу из функции test()
Указатель также уничтожается при выходе из функции, так что ругань идет на то, что объект уничтожается еще до присвоения указателю. И код полностью аналогичен вашему, насколько я понимаю.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 2nd September 2025 - 07:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.02232 секунд с 7
ELECTRONIX ©2004-2016