仅更改功能上的特定默认参数

时间:2019-03-06 09:52:22

标签: c++ qt qt5

我正在使用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);

有效。

我真的不明白为什么我不能更改我想要的默认参数,而将其余参数保留为默认值?。

3 个答案:

答案 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为例