Как использовать «шаблон функции-члена» в классах кнопок QT5? - PullRequest
0 голосов
/ 14 июня 2019

Теперь я написал 2 класса кнопок в QT5, для добавления и установки их в пользовательском интерфейсе MainWidnow, я написал 2 функции, принадлежащие файлу maindow для почти одной и той же операции, каждая функция получит 2 типа аргументов, 1-й - пользовательский имя класса кнопки, 2nd - это QVector, содержащий несколько кнопок, принадлежащих к одному и тому же классу, я хочу использовать шаблон функции-члена, однако он не работает.

Некоторые сегменты кода, которые я разместил ниже:


// the 2 buttons classes I defined

// pic_btn.h, only show simplified codes
class pic_btn : public QWidget
{
  ...
};

// button.h, only show simplified codes
class button : public QWidget, private Ui::button
{
  ...
};


// In the mainwindow.h, I defined 
protected:
   template<typename v,typename c> void MainWindow ::add_allbtns(v vec ,c btn);

private:
    QVector<button*> btns;
    QVector<pic_btn*> pbtns;

// in the mainwindow.cpp
// the variables btn_names, btn_num,btns_w,btns_h,x_p,offsetY are pre-defined already.

template<typename v,class c> void MainWindow::add_allbtns(v vec ,c btn)
{
    // add buttons,
    for(int i=0;i<btn_num;i++)
    {
      btn *bt=new btn(btn_names[i]);
      vec.push_back(bt);
    }

    //set buttons parent,size and positions
    for(int i=0;i<btn_num;i++)
    {
      vec[i]->setParent(this);
      vec[i]->setGeometry(0,0,btns_w,btns_h);
      vec[i]->move(x_p[i],offsetY);
    }
}


// I want to use it like the way below in the constructor of mainwindow.cpp

   add_allbtns(btns,button);

однако, это не работает, и ошибка:

bt не было объявлено в этой области. , что происходит снизу

for(int i=0;i<btn_num;i++)
    {
      btn *bt=new btn(btn_names[i]);
      vec.push_back(bt);
    }

btn - это имя класса кнопки.

Любые советы о том, как его изменить? Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 14 июня 2019

Чтобы получить всю доступную информацию, современные компиляторы, как правило, требуют, чтобы шаблон был полностью определен при каждом его использовании. Это включает в себя все его функции-члены и все функции шаблона, вызываемые из них. Следовательно, разработчики шаблонов обычно размещают определение шаблона в заголовочных файлах.

https://www.bogotobogo.com/cplusplus/template_declaration_definition_header_implementation_file.php

Попробуйте поместить реализацию функции шаблона в файл заголовка, а не в файл cpp.

protected:
    template<typename v,class c> 
    void add_allbtns(v vec ,c btn)
    {
        // add buttons,
        for(int i=0;i<btn_num;i++)
        {
            btn *bt=new btn(btn_names[i]);
            vec.push_back(bt);
        }

        //set buttons parent,size and positions
        for(int i=0;i<btn_num;i++)
        {
            vec[i]->setParent(this);
            vec[i]->setGeometry(0,0,btns_w,btns_h);
            vec[i]->move(x_p[i],offsetY);
        }
    }
private:
    QVector<button*> btns;
    QVector<pic_btn*> pbtns;
0 голосов
/ 14 июня 2019

btn - это имя вашего параметра, а не имя класса. Вы должны использовать c вместо:

      c *bt=new c(btn_names[i]);

Конечно, вам нужно исправить это и в остальной части вашей функции.

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