Ключевое слово explicit
отлично работает в моем примере, но позже я понял, что мой код реального мира не работает на перегруженном методе, а не на конструкторе. (Я виноват в том, что задал вопрос, который был похож на мою настоящую проблему, но не совпадал с ней.) Как отметил Марк Рэнсом в комментариях к принятому ответу, explicit
работает только на конструкторах. Я нашел обходной путь, который решил мою проблему, поэтому я решил опубликовать его здесь. Новый пример кода:
class thing {
public:
thing( int x ) {
printf( "Creating a thing(%d)\n", x );
}
};
class X {
public:
void do_something( const thing &t ) {
printf( "Creating an X from a thing\n" );
}
};
int main( int, char ** ) {
thing a_thing( 5 );
X an_x;
an_x.do_something( 6 );
return 1;
}
Этот код показывает тот же вывод, что и исходный код, но я не могу использовать explicit
, чтобы исправить это. Вместо этого я добавил приватный метод, который принимает int
:
private:
void do_something( int x );
Теперь компилятор не создает временный объект, он выдает ошибку, потому что я пытаюсь вызвать закрытый метод извне класса.