2015-05-18 4 views
0

Почему мой конструктор преобразования не работает? Явное преобразование компилируется отлично.Почему неявное преобразование не встречается

struct element {}; 

struct element_set { 
    element_set(const element& e) : e(e) {}; 
    element_set& operator+(const element& e) { return *this; } 

    const element &e; 
}; 

element e1, e2; 

auto es1 = element_set(e1) + e2; 
auto es2 = e1 + e2; 

kent:kas kent$ g++ -std=c++14 -g implicit.cc 
implicit.cc:13:15: error: invalid operands to binary expression ('element' and 'element') 
auto es2 = e1 + e2; 
      ~~^~~ 
1 error generated. 

На основании ответа от @Krizz и комментарий от @BenVoigt ниже, я могу получить неявное преобразование работает, добавив друга element_set:

struct element_set { 
    element_set(const element& e) : e(e) {}; 
    element_set& operator+(const element& e) { return *this; } 
    friend element_set operator+(const element& l, const element& r); 
    const element &e; 
}; 

element_set operator+(const element& l, const element& r) { return l+r; } 

Спасибо за быструю помощь!

+1

Определенные пользователем преобразования не работают с аргументом неявного объекта. –

+3

'operator +' не должен быть функцией-членом. Попробуйте как функцию друга (с двумя аргументами) ... –

+0

'operator +' возврат ссылки - плохая идея тоже –

ответ

2

Ваш код, где используются операторы, эквивалентно:

element e1, e2; 
auto es1 = element_set(e1).operator+(e2); 
auto es2 = e1.operator+(e2); 

Вы можете видеть теперь, почему это не работает? Нет способа operator+ на struct element. Таким образом, единственное, что может сделать компилятор, - это достижимые функции формы:

R operator+(TypeConvertibleFromElement, TypeConvertibleFromElement) 

Нет такой функции.

Примечание: Выше приведено только для ознакомительных целей. Обсуждение спецификации языка C++ и работы компиляторов потребует более точных описаний.

+0

Право. Если мне требуется автоматическое преобразование, мне нужно добавить оператор преобразования в элемент. Благодарю. – KentH

+1

@KentH Даже оператор преобразования не работает для левой руки. – Johan

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