Xét đoạn mã sau:Giải pháp cho bối cảnh nondeduced
#include <iostream>
template<class T>
struct outer {
struct inner {};
};
template<class T>
std::ostream& operator<<(std::ostream & stream,
typename outer<T>::inner const& value) {
std::cout << "An outer::inner!";
return stream;
}
int main() {
outer<float>::inner foo;
std::cout << foo << std::endl; // does not compile
}
này không biên dịch, vì typename outer<T>::inner
là một bối cảnh nondeduced (như đã giải thích here), có nghĩa là mẫu đối số kiểu không thể suy luận bởi trình biên dịch (đọc this answer vì lý do). Như tôi thấy, tôi có hai tùy chọn để làm cho nó hoạt động:
- Di chuyển
inner
bên ngoàiouter
và biến nó thành một mẫu lớp. Tôi thích cái này, vì tác động lên mã sử dụng nhỏ hơn. - Thêm
to_string
-method vào bên trong.
Có bất kỳ giải pháp nào khác cho điều này (không dẫn đến cú pháp xấu trong mã sử dụng) không?
+1 cho cả hai kỹ thuật. Ước gì tôi có thể cho +2. – Nawaz
Cách tiếp cận 'friend' hoạt động tốt. Tôi không biết rằng bạn có thể định nghĩa một hàm trong khai báo 'friend' (đối với những người quan tâm: tôi chỉ tìm kiếm nó, nó được định nghĩa trong §11.4.5 của tiêu chuẩn 2003). –