Адрес связанной функции-члена - PullRequest
2 голосов
/ 22 ноября 2011

У меня есть следующая функция-член:

void GClass::InitFunctions()
{ // Initialize arrays of pointers to functions.

ComputeIntLen[0] = &ComputeILS;
ComputeIntLen[1] = &ComputeILE;
ComputeIntLen[2] = &ComputeILI;
PostStep[0] = &PSS;
PostStep[1] = &PSE;
PostStep[2] = Ψ
gRotation = new Rotation();
}

Очевидно, GClass содержит все соответствующие члены:

    void ComputeILE(Int_t, Int_t *, Double_t *);
    void ComputeILI(Int_t, Int_t *, Double_t *);
    void PSS(Int_t , Int_t *, Int_t &, Int_t*);
    void PSE(Int_t, Int_t *, Int_t &, Int_t*);
    void PSI(Int_t , Int_t *, Int_t &, Int_t*);
    ComputeIntLenFunc ComputeIntLen[gNproc];
    PostStepFunc      PostStep[gNproc];
... //other members
}

, где gNproc - глобальное const int, а ComputeIntLenFunc и PostStepFunc -typedefs вроде этого:

typedef void (*ComputeIntLenFunc)(Int_t ntracks, Int_t *trackin, Double_t *lengths);
typedef void (*PostStepFunc)(Int_t ntracks, Int_t *trackin, Int_t &nout, Int_t* trackout);

Когда я компилирую это, я получаю gcc выдает ошибку: «ISO C ++ запрещает брать адрес неквалифицированной или заключенной в скобки нестатической функции-члена для формирования указателя на функцию-член. Скажем'& GClass :: ComputeIntLenScattering' "

Когда я заменяю FunctionNames на GClass :: FunctionNames в InitFunctions (), я получаю" не могу преобразовать "void (GClass :: *) (Int_t, Int_t *, Double_t *) 'в'void (*) (Int_t, Int_t *, Double_t *)' в задании "

Пожалуйста, помогите мне.Что это за тема C ++?

Ответы [ 2 ]

1 голос
/ 22 ноября 2011

Вам также необходимо добавить класс к вашим typedefs:

typedef void (GClass::*ComputeIntLenFunc)(Int_t ntracks, Int_t *trackin, Double_t *lengths);
typedef void (GClass::*PostStepFunc)(Int_t ntracks, Int_t *trackin, Int_t &nout, Int_t* trackout);

Тогда ваш (первый) тип будет означать: это указатель на функцию-член в классе GClass, которая принимает Int_t, Int_t* и т. д., тогда как в вашей версии он просто ссылался на свободную функцию с теми же параметрами.

1 голос
/ 22 ноября 2011

Нестатический указатель на функцию-член отличается от указателя на свободную функцию. То, что вы используете, это в основном бесплатные указатели на функции, которые не будут работать, так как тип &GClass::ComputeILS несовместим с ComputeIntLenFunc.

Используйте это:

typedef void (GClass::*ComputeIntLenFunc)(Int_t, Int_t *, Double_t *);
typedef void (GClass::*PostStepFunc)(Int_t, Int_t *, Int_t &, Int_t*);

Я опустил имена параметров, так как они не требуются в typedefs.

Кроме того, вы должны использовать GClass::, когда получите адрес функций-членов:

ComputeIntLen[0] = &GClass::ComputeILS;
ComputeIntLen[1] = &GClass::ComputeILE;
ComputeIntLen[2] = &GClass::ComputeILI;
PostStep[0] = &GClass::PSS;
PostStep[1] = &GClass::PSE;
PostStep[2] = &GClass::PSI;

Сообщение об ошибке очень ясно говорит об этом:

ISO C ++ запрещает принимать адрес неквалифицированной или нестатической функции-члена в скобках для формирования указателя на функцию-член. Скажите ‘& GClass :: ComputeIntLenScattering

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...