Невозможно назначить 2D-массив указателей функций - PullRequest
1 голос
/ 08 января 2020

У меня " В этом объявлении нет ошибки класса или спецификатора типа " в Visual Studio, чем я пытаюсь инициализировать мой массив с функциями. Я объявляю массив в заголовке:

typedef void (*MultimethodFunc)(ofstream& out);

extern MultimethodFunc multimethodFunc[][10];

In. cpp файл У меня есть это:

MultimethodFunc multimethodFunc[10][10];

И, наконец, я пытаюсь инициализировать его в другом. cpp :

void TrainTrainOut(ofstream& out) {
    out << "\nTrain and Train" << endl;
}

void MMTrainTrainOut(ofstream& out) {
    return TrainTrainOut(out);
}

multimethodFunc[1][1] = MMTrainTrainOut;
multimethodFunc[1][2] = MMTrainAirplaneOut;
multimethodFunc[2][1] = MMAirplaneTrainOut;
multimethodFunc[2][2] = MMAirplaneAirplaneOut;

Другие функции, аналогичные TrainTrainOut и MMTrainTrainOut с различными выходами и совпадающими доходами. Ошибка помещается в последние строки, там я пытаюсь назначить функции для массива. Что я делаю не так в этом случае? Спасибо!

1 Ответ

2 голосов
/ 08 января 2020

Вы не можете поместить присвоение в область видимости файла.

Следующая программа выдает ошибку:

В этом объявлении нет класса хранения или спецификатора типа

#include <fstream>

using namespace std;

typedef void (*MultimethodFunc)(ofstream& out);

void TrainTrainOut(ofstream& out) {
    out << "\nTrain and Train" << endl;
}

void MMTrainTrainOut(ofstream& out) {
    return TrainTrainOut(out);
}

MultimethodFunc multimethodFunc[10][10];

multimethodFunc[1][1] = MMTrainTrainOut;  /* ERROR HERE */
multimethodFunc[1][2] = MMTrainTrainOut;
multimethodFunc[2][1] = MMTrainTrainOut;
multimethodFunc[2][2] = MMTrainTrainOut;

int main() {

}

Следующая программа компилируется. Это решает проблему путем перемещения назначений в функцию инициализации и явного вызова функции инициализации где-то (например: main)

#include <fstream>

using namespace std;

typedef void (*MultimethodFunc)(ofstream& out);

void TrainTrainOut(ofstream& out) {
    out << "\nTrain and Train" << endl;
}

void MMTrainTrainOut(ofstream& out) {
    return TrainTrainOut(out);
}

MultimethodFunc multimethodFunc[10][10];


void initializeThings() {
    multimethodFunc[1][1] = MMTrainTrainOut;
    multimethodFunc[1][2] = MMTrainTrainOut;
    multimethodFunc[2][1] = MMTrainTrainOut;
    multimethodFunc[2][2] = MMTrainTrainOut;
}

int main() {
    initializeThings();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...