Russian Qt Forum

Программирование => С/C++ => Тема начата: 0...-5 от Февраль 13, 2011, 14:00



Название: Перестановка мест...))
Отправлено: 0...-5 от Февраль 13, 2011, 14:00
Объясните, почему сборка выражения 'y = -c * x' выдает ошибку 'collect2 ld returned 1 exit status', если 'c' объявлена в классе с модификаторами static const, тогда как с выражением 'y = -x * c' таких проблем нет...


Название: Re: Перестановка мест...))
Отправлено: Fat-Zer от Февраль 13, 2011, 14:09
хоть написали бы каких типов переменные... и что принимает/возвращает operator* и унарный operator- для них


Название: Re: Перестановка мест...))
Отправлено: brankovic от Февраль 13, 2011, 14:12
Такое бывает, когда компилятор пытается сделать ссылку на static const переменную. По сути это глюк, можно обойти через int tmp = c и дальше юзать tmp.

Просто интересно, какой компилятор? В gcc вроде это давно пофиксили..


Название: Re: Перестановка мест...))
Отправлено: 0...-5 от Февраль 13, 2011, 14:23
хоть написали бы каких типов переменные... и что принимает/возвращает operator* и унарный operator- для них

float, операторы не перегружались


Название: Re: Перестановка мест...))
Отправлено: 0...-5 от Февраль 13, 2011, 14:24
Такое бывает, когда компилятор пытается сделать ссылку на static const переменную. По сути это глюк, можно обойти через int tmp = c и дальше юзать tmp.

Просто интересно, какой компилятор? В gcc вроде это давно пофиксили..

Именно gcc...Если это глюк, то весьма неприятный(((


Название: Re: Перестановка мест...))
Отправлено: BRE от Февраль 13, 2011, 14:26
Именно gcc...Если это глюк, то весьма неприятный(((
Вижу ошибку линковки... Вопрос: а статический член класса правильно описан?


Название: Re: Перестановка мест...))
Отправлено: 0...-5 от Февраль 13, 2011, 14:40
Цитировать
Вижу ошибку линковки... Вопрос: а статический член класса правильно описан?

static const float c = 0.1
А собственно, где тут можно ошибиться?


Название: Re: Перестановка мест...))
Отправлено: Fat-Zer от Февраль 13, 2011, 14:44
static const float c = 0.1
А собственно, где тут можно ошибиться?

Если так в хедере написано, то можно... не уверен но вроде надо так:
Код
C++ (Qt)
// в хедере:
class A
{
 static const float c;
}
 
// в cpp:
const float A::c=0.1;
 
могу ошибаться...


Название: Re: Перестановка мест...))
Отправлено: brankovic от Февраль 13, 2011, 14:54
static const float c = 0.1
А собственно, где тут можно ошибиться?

Вообще-то по стандарту запрещено флоаты определять как static const члены c присвоением в классе, это расширение gcc. Лучше так делать:

struct A {static float const f;};
float const A::f = 0.1;

Другое дело такой глюк и с интами бывает. Общий work-around состоит в замене

static float const c = 0.1;

на

static float c () {return 0.1;}


Название: Re: Перестановка мест...))
Отправлено: 0...-5 от Февраль 13, 2011, 16:10
Хм...но ведь 'y = -x * c' не вызывает ошибки, т.е. дело в применении отрицания к статическому члену класса...С интами, честно говоря, не пробовал, но использование статической функции смахивает на костыли ;D