Tôi có lớp sử dụng lớp lồng nhau và muốn sử dụng lớp lồng nhau operator<<
để xác định operator<<
ở lớp trên. Sau đây là cách mã của tôi trông giống như:Toán tử tải trọng <<: không thể ràng buộc lvalue thành ‘std :: basic_ostream <char> &&’
#include <memory>
#include <iostream>
template<typename T>
struct classA {
struct classB
{
template<typename U>
friend inline std::ostream& operator<< (std::ostream &out,
const typename classA<U>::classB &b);
};
classB root;
template<typename U>
friend std::ostream& operator<< (std::ostream &out,
const classA<U> &tree);
};
template<typename T>
inline std::ostream& operator<< (std::ostream &out,
const classA<T> &tree)
{
out << tree.root;
return out;
}
template<typename T>
inline std::ostream& operator<< (std::ostream &out,
const typename classA<T>::classB &b)
{
return out;
}
int main()
{
classA<int> a;
std::cout << a;
}
Khi biên dịch mà không cần sự hỗ trợ cho C++ 11, định nghĩa về hành < < cho lớp bên trong có vẻ như không được tìm thấy bởi trình biên dịch:
so.hpp:24:7: error: no match for ‘operator<<’ in ‘out << tree.classA<int>::root’ so.hpp:24:7: note: candidates are: ...
với GCC 4.6 và 4.7 khi biên dịch với std = C++ 0x:
so.hpp:21:3: error: cannot bind ‘std::ostream {aka std::basic_ostream<char>}’ lvalue to ‘std::basic_ostream<char>&&’ In file included from /usr/include/c++/4.7/iostream:40:0, from so.hpp:2: /usr/include/c++/4.7/ostream:600:5: error: initializing argument 1 of ‘std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Tp = classA<int>::classB]’
Ai đó có thể cho tôi biết tại sao mã này không hợp pháp và cách tốt nhất để làm những gì tôi muốn là gì?
Cảm ơn bạn đã cung cấp giải pháp thay thế. – Antoine
Tôi thấy nó giống như thiết kế * tốt hơn * thay vì * giải pháp thay thế *. Nó có nhược điểm của nó (bạn không thể lấy địa chỉ của hàm friend được khai báo bên trong lớp template), nhưng trên tất cả các tài khoản khác, nó phù hợp hơn để cung cấp các toán tử miễn phí ... –
Đây là [Tạo mới bạn bè] (https : //en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Making_New_Friends) thành ngữ, do đó, không thực sự là một cách giải quyết. – TBBle