2014-11-26 2 views
1

я следующий класс (это не мой реальный класс, но только для целей иллюстрации):Потерялись подходящий конструктор

class Number { 
public: 
    Number() : value_(0) {} 

    explicit Number(int v) : value_(v) {} 

    Number(const Number & other){ 
     value_ = other.value_; 
    } 

    Number& operator=(const int & v){ 
     value_ = v; 
     return *this; 
    } 

private: 
    int value_; 
}; 

я могу сделать следующее, и все они работают правильно:

void test_ok(){ 
    Number x(3); 
    Number y = Number(3); 
    Number y2(x); 
    Number y3 = x; 
    Number u; 
    u = 3; 
} 

Однако следующие дает эту ошибку компилятора: нет подходящего конструктора не существует для преобразования из «ИНТ» в «Номер»

void test_error(){ 
    Number z = 3; 
} 

Если я прокомментирую слово «явный» от второго конструктора, ошибка компилятора исчезнет, ​​и, по-видимому, автоматическое преобразование работает нормально. Так как я хотел бы сохранить ключевое слово «Явным», какой конструктор мне не хватает?

Заранее благодарен!

ответ

0

Ключевое слово explicit запрещает неявное автоматическое приведение типов. В вашем тесте Number z = 3 вы делаете именно это - неявное приведение типов, от int (3) до Number. Компилятор по праву запрещает это.

Если вы хотите сохранить ключевое слово explicit, вам нужно будет построить объект Number как Number(3) (как вы уже заметили и написали).

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

+0

Спасибо, поэтому я думаю, это просто невозможно. Мне просто интересно, какое преобразование по умолчанию использует компилятор, когда я удаляю ключевое слово , и если это можно было бы перегрузить. – ramonvp

+0

Неявное преобразование, которое вы разрешаете, удаляя ключевое слово 'explicit', - это ввести тип 3 в' Number'. Вы получаете такое же поведение, когда используете 'Number z = static_cast (3);' и в этом случае вы можете сохранить ключевое слово '' '' '' ', потому что хорошо .. вы явно обрабатываете typecast ;-) –

Смежные вопросы