现在我在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是按钮类名称。
有关如何进行修改的任何提示? 非常感谢!
答案 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;