2016-02-22 2 views
2

Когда определены как operator <<(std::ostream&..., так и общий оператор преобразования template<typename T> operator T(), std::cout << foo(); неоднозначен. Есть ли способ сделать это решение для вызова operator <<?Как выбрать `operator <<` over generic `operator T()` conversion?

Кратчайший рабочий код:

#include<iostream> 

struct foo { 
    int x; 
    template<typename T> operator T() { return static_cast<T>(x); } 
    friend std::ostream& operator <<(std::ostream& out, foo& f) { return out << f.x; } 
}; 

//std::ostream& operator <<(std::ostream& out, foo& f) { return out << f.x; } // doesn't help 

int main() { 
    std::cout << foo() << std::endl; 
    return 0; 
} 
+0

'operator <<' там даже не жизнеспособен, так как 'foo()' является rvalue, а ваш 'operator <<' требует аргумента lvalue. – aschepler

+0

[Этот код работает] (http://ideone.com/dbiawM). –

ответ

3

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

Изменение своей декларации

friend std::ostream& operator <<(std::ostream& out, const foo& f) { return out << f.x; } 

устраняет проблему. Теперь ваш оператор лучше соответствует, так как он не требует преобразования.

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

  • Нет связанных вопросов^_^