2011-11-29 38 views
12

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:

  1. Di chuyển inner bên ngoài outer 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.
  2. 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?

Trả lời

20

Bạn có thể di chuyển toán tử vào phần thân bên trong và đặt friend trước nó. Sau đó, thay thế loại thông số chỉ bằng inner.

Một kỹ thuật khác là lấy được bên trong từ một cơ sở CRTP được tham số hóa bởi bên trong. Sau đó, làm cho tham số nhập lớp CRTP và đưa tham chiếu tham số đến lớp bắt nguồn inner, loại được đưa ra bởi đối số mẫu mà bạn suy ra.

+1

+1 cho cả hai kỹ thuật. Ước gì tôi có thể cho +2. – Nawaz

+0

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). –

Các vấn đề liên quan