如何在QT5按钮类中使用“成员函数模板”?

时间:2019-06-14 14:04:56

标签: c++ qt

现在我在QT5中编写了2个按钮类,用于将它们添加并设置到MainWidnow UI中,我为几乎相同的操作编写了2个属于maindow文件的函数,每个函数将接收2种类型的参数,第一种是自定义按钮类名称,第二个是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 :(得分:0)

btn是您的参数名称,而不是类名称。您应该改用c

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

当然,您还需要在其余功能中对此进行修复。

答案 1 :(得分:0)

要获得所有可用信息,当前的编译器往往要求在使用模板时必须完全定义模板。这包括其所有成员函数以及从中调用的所有模板函数。因此,模板编写者倾向于将模板定义放在头文件中。

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;