шаблонные классы

264
10 июня 2018, 05:40

помогите разобраться с шаблонными классами

error C2760: синтаксическая ошибка: ожидался токен "<Нет данных>", а не "<Нет данных>"

среда разработки visual studio 2017

template <typename T1, typename T2, typename T3>
class element {
    string name;
    Menu* menu = NULL;
    Menu* left = NULL;
    Menu* right = NULL;
public:
    element(T1 A = NULL, T2 B = NULL, T3 C = NULL) {
        menu = dynamic_cast<MENU*>(A);
        left = dynamic_cast<MENU*>(B);
        right = dynamic_cast<MENU*>(C);
    }
    void get_type_menu() {
        cout << typeid(menu).name << endl;
    }
};
int main()
{
    hMenu A;
    wMenu B;
    hwMenu C;
    element<hMenu*, wMenu*, hwMenu*> el(&A, &B, &C);
    el.get_type_menu();
    return 0;
}   
Answer 1

Все просто, вы пытаетесь указатель к указателю на указатель привести, передавая его как тип в шаблон. Т.е. для решения проблемы вам необходимо

  1. Отказаться от передачи типа параметра как указатель.
  2. В методе принимать указатели на данные с типом переданным в метод.
template <typename T1, typename T2, typename T3>
class element {
    string name;
    Menu* menu = NULL;
    Menu* left = NULL;
    Menu* right = NULL;
public:
    element(T1* A = NULL, T2* B = NULL, T3* C = NULL) {
        menu = dynamic_cast<MENU*>(A);
        left = dynamic_cast<MENU*>(B);
        right = dynamic_cast<MENU*>(C);
    }
    void get_type_menu() {
        cout << typeid(menu).name << endl;
    }
};
int main()
{
    hMenu A;
    wMenu B;
    hwMenu C;
    element<hMenu, wMenu, hwMenu> el(&A, &B, &C);
    el.get_type_menu();
    return 0;
}

Хотя на самом деле тут нет смысла передачи в класс типов, т.к. вы их не используете. А передавая какой-то тип в метод, его можно пометить как template и генерировать тип на лету.

Т.е. вместо шаблона класса сделать только метод шаблонным.

class element {
    string name;
    Menu* menu = NULL;
    Menu* left = NULL;
    Menu* right = NULL;
public:
    template <typename T1, typename T2, typename T3>
    element(T1* A = NULL, T2* B = NULL, T3* C = NULL) {
        menu = dynamic_cast<MENU*>(A);
        left = dynamic_cast<MENU*>(B);
        right = dynamic_cast<MENU*>(C);
    }
    void get_type_menu() {
        cout << typeid(menu).name << endl;
    }
};

И еще не совсем понятно каким образом вы передавали тип в dynamic_cast а не сам параметр метода.

READ ALSO
OpenCV Какой алгоритм лучше выбрать?

OpenCV Какой алгоритм лучше выбрать?

у меня такая ситуация : нужно сделать софт который будет по видео распознавать машины и какой размер они занимают на картинке, на фоне дороги,...

159
Как подключить jpg картинку в API

Как подключить jpg картинку в API

Пробую через olectlh- почему не получается

239
Vue router, пошаговая регистрация

Vue router, пошаговая регистрация

Хочу сделать пошаговою регистрацию с помощью Vue routerНо, не понимаю как можно реализовать задумку

259