Включение заголовка и ошибки компилятора - PullRequest
0 голосов
/ 25 июля 2010

В моем файле CPP у меня есть вызов:

pt.x = mDownPoint.x + FSign(pt.x-mDownPoint.x) *
        FMax( FAbs(pt.x-mDownPoint.x), FAbs(pt.y-mDownPoint.y) );

Я получаю ошибки компилятора для FSign, FMax, FAbs, но я включаю файл заголовка, где они находятся в.

Так что я не понимаю, почему он не может его найти, если я не сделал что-то не так при создании этого файла заголовка.

Могу ли я получить некоторые указания на то, что я делаюне так?

Заголовок:

class FxMathFunctions
{
struct FxPoint2d;

public:
    FxMathFunctions();
    ~FxMathFunctions();

    static FxInt32 IMin(FxInt32 i1,FxInt32 i2);
    static FxInt32 IMax(FxInt32 i1,FxInt32 i2);
    static FxInt32 ILimit(FxInt32 val, FxInt32 i1, FxInt32 i2);
    static FxDouble FMin(FxDouble i1,FxDouble i2);
    static FxDouble FMax(FxDouble i1,FxDouble i2);
    static FxFloat FMax(FxFloat i1,FxFloat i2);
    static FxFloat FLimit(FxFloat val, FxFloat i1, FxFloat i2);
    static FxDouble FrInverseContrast(FxDouble opacity,FxDouble antialias);
    static FxInt32 ISign(FxInt32 l);
    static FxFloat FSign(FxFloat v);
    static FxInt32 IAbs(FxInt32 l);
    static FxFloat FAbs(FxFloat v);
    static FxInt32 INonzero(FxInt32 l);
    static double DAbs(double v);
    static FxInt32 Sqr(FxByte v);
    static FxInt32 Sqr(FxInt32 v);
    static FxFloat Sqr(FxFloat v);
    static FxDouble Sqr(FxDouble v);
    static FxInt32 FrCubed(FxByte v);
    static FxInt32 FrCubed(FxInt32 v);
    static FxFloat FrCubed(FxFloat v);
    static FxDouble FrCubed(FxDouble v);
    static FxDouble FrFourthPower(FxDouble v);
    static FxFloat FrFourthPower(FxFloat v);
    static FxBool FNearEqual(FxFloat val, FxFloat nearTo, FxFloat closeness = 0.00001f);
    static FxBool FNearGreaterEqual(FxFloat val, FxFloat nearTo, FxFloat closeness = 0.00001f);
    static FxBool FNearLessEqual(FxFloat val, FxFloat nearTo, FxFloat closeness = 0.00001f);
};

.CPP к Заголовку, где это применимо, для одной неисправной функции:

FxFloat FAbs(FxFloat v)
{
    if (v < 0.0f) v = -v;
    return v;
}

РЕДАКТИРОВАНИЕ:

Исправленовызов:

pt.x = mDownPoint.x + FxMathFunctions::FSign(pt.x-mDownPoint.x) * 
                FxMathFunctions::FMax( FxMathFunctions::FAbs(pt.x-mDownPoint.x),
                FxMathFunctions::FAbs(pt.y-mDownPoint.y) );

Сбой:

ошибка: невозможно вызвать функцию-член 'FxFloat FxMathFunctions :: FAbs (FxFloat)'

1 Ответ

1 голос
/ 25 июля 2010

Все функции находятся в пределах FxMathFunctions, поэтому должно быть:

pt.x = mDownPoint.x + FxMathFunctions::FSign(pt.x-mDownPoint.x) *
        FxMathFunctions::FMax( FxMathFunctions::FAbs(pt.x-mDownPoint.x), 
        FxMathFunctions::FAbs(pt.y-mDownPoint.y) );

Но это то, для чего нужны пространства имен, я не думаю, что вы действительно хотите класс. Если это пространство имен, вы можете даже сделать using namespace FxMathFunctions; в верхней части функции, в которой находится ваш код, и оставить код, который у вас есть в вопросе.


Во-вторых, многие из этих функций не нужно писать, если только вы не получили их от руки. (Просто используйте cmath и utility для таких вещей, как std::fabs и std::min.) Наконец, почему бы не перегрузить FAbs и DAbs до Abs, как вы делаете для Sqr? Это сделало бы интерфейс проще.

...