Есть два класса A и B, в классе A нет определения <<, но есть в классе B. Не хочет неявно приводить тип A к типу B, хотя, по идее, всё нормально. В чём проблема?
...
class B;
class A
{
public:
friend class B;
A(B& s_,...):s(s_),... {} // Конструктор с параметром типа B&
...
operator B const& () const {return s;} // <-- приведение
operator B& () {return s;} // <-- приведение
private:
B& s;
...
};
class B
{
public:
... // всякие конструкторы и функции
friend ostream& operator << (ostream &os, B const &s)
{
... // не вызывает подозрений
return os;
}
friend class A;
A operator [] (B const &s2) // метод, для которого и нужен класс A
{
...
return A(*this,...);
}
}
В main пишу такое:
B s(...),s1(...);
cout << s[s1]; // <-- ошибка в этой строке
Появляется ошибка
[Error] cannot bind 'std::ostream {aka std::basic_ostream}' lvalue to 'std::basic_ostream&&'
Что интересно, если написать явное приведение, то всё норм:
cout << (B const& ) s[s1]; // <-- ошибки нет
P.s.: проблема именно в приведении, т.к. я написал << специально для A и всё работало.
<<? – mark113 Mar 01 '16 at 16:43...в коде) не считая ошибки, указанной вами в вопросе. – StateItPrimitive Mar 01 '16 at 16:55cout << s[s1];. Как я это скомпилирую без конструкторов,[], всех данных и<<? – mark113 Mar 01 '16 at 16:57ostream& operator << (ostream &os, B const &s)из классаB. – StateItPrimitive Mar 01 '16 at 17:18<<? – mark113 Mar 01 '16 at 17:31friend(раньше я никогда не пробовал реализацию функции писать там же где и само объявление другом внутри класса - я считал, что это вообще недопустимо!)? – StateItPrimitive Mar 01 '16 at 17:43