我正在使用qt
,并且尝试使用QInputDialog::getText()
函数从用户那里获取输入,而从Documentation函数的定义是:
QString QInputDialog::getText(QWidget * parent, const QString & title, const QString & label, QLineEdit::EchoMode mode = QLineEdit::Normal, const QString & text = QString(), bool * ok = 0, Qt::WindowFlags flags = 0, Qt::InputMethodHints inputMethodHints = Qt::ImhNone)
这是我的代码:
bool ok=0;
newAddress = QInputDialog::getText(0,"Enter an Address to Validate",
"Adress: comma separated (e.g Address line 1, Address line 2, City, Postal Code)"
,&ok);
但是我得到了错误:
error: no matching function for call to 'QInputDialog::getText(int, const char [29], const char [80], bool*)'
,&ok);
^
但是当我在*ok
参数之前传递所有参数时,例如:
bool ok=0;
newAddress = QInputDialog::getText(0,"Enter an Address to Validate",
"Adress: comma separated (e.g Address line 1, Address line 2, City, Postal Code)"
,QLineEdit::Normal,
QString(),&ok);
有效。
我真的不明白为什么我不能更改我想要的默认参数,而将其余参数保留为默认值?。
答案 0 :(得分:14)
当传递具有默认参数的特定参数的值时,必须在其之前传递所有默认参数的值。否则,您传递的值将作为第一个默认参数的值。
所以您必须这样做:
newAddress = QInputDialog::getText(
0,
"Enter an Address to Validate",
"Adress: comma separated (e.g Address line 1, Address line 2, City, Postal Code)",
QLineEdit::Normal,
QString(),
&ok);
您可以省略参数bool *
之后的参数传递值。
C ++标准在[dcl.fct.default]/1
中声明
默认参数将在缺少尾部参数的调用中使用。
答案 1 :(得分:8)
在C ++中,您只能在参数列表的末尾使用(一个或多个)默认参数。如果在中间省略参数,则编译器将无法知道哪个参数属于哪个参数。因此,必须在传递QLineEdit::Normal and QString()
之前手动指定默认参数&ok
。
在您无法使用的情况下,编译器会尝试将布尔指针与参数列表中的下一个类型匹配,该类型为QLineEdit::EchoMode
,因此不兼容。
答案 2 :(得分:3)
错误是由于可选参数引起的:
QString QInputDialog::getText(
QWidget * parent,
const QString & title,
const QString & label,
QLineEdit::EchoMode mode = QLineEdit::Normal,
const QString& text = QString(),
bool * ok = 0,
Qt::WindowFlags flags = 0,
Qt::InputMethodHints inputMethodHints = Qt::ImhNone)
QInputDialog::getText(
0,
"Enter an Address to Validate",
"Adress: comma separated (e.g Address line 1, Address line 2, City, Postal Code)",
--> QLineEdit::EchoMode ??
--> QString& text ??
&ok);
如果设置了一个可选参数,则必须在其左侧设置所有可选参数,以QLineEdit :: EchoMode和QString&text为例