Изменить только определенный параметр по умолчанию для функции

Я использую qt и я пытаюсь использовать QInputDialog::getText() для получения ввода от пользователя, из Документации определение функции:

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);

оно работает.

Я действительно не понимаю, почему я не могу просто изменить параметр по умолчанию, который я хочу, и оставить остальные по умолчанию?.

Ответы

Ответ 1

Когда вы передаете значение для определенного параметра, который имеет аргумент по умолчанию, вы должны передать значения для всех параметров по умолчанию перед ним. В противном случае переданное вами значение будет принято как значение для первого параметра по умолчанию.

Итак, вы должны сделать это:

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

Аргументы по умолчанию будут использоваться в вызовах, где завершающие аргументы отсутствуют.

Ответ 2

В C++ вы можете использовать только (один или несколько) параметров по умолчанию в конце списка параметров. Если вы опустите параметры в середине, компилятор не сможет узнать, какой аргумент принадлежит какому параметру. Поэтому вы должны указать параметры по умолчанию QLineEdit::Normal and QString() вручную перед передачей &ok.

В вашем не работающем случае компилятор пытается сопоставить ваш bool-указатель со следующим типом в списке параметров, который является QLineEdit::EchoMode и поэтому не совместим.

Ответ 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