2016-02-26 15 views
7

tôi muốn làm một cái gì đó như thế này:Template đối số không suy luận cho lớp bên trong

#include <iostream> 

template<typename T> 
class myclass 
{ 
    T something; 
public: 
    myclass(T something) : something{ something } 
    { } 

    struct result 
    { 
     T value; 
    }; 

    result get_result() 
    { 
     return{ something }; 
    } 
}; 

template<typename T> 
std::ostream& operator<<(std::ostream& stream, const typename myclass<T>::result& res) 
{ 
    return stream << res.value; 
} 

int main() 
{ 
    myclass<int> m(0); 
    std::cout << m.get_result() << "\n"; 
} 

Trong trường hợp này không phải gcc cũng không msvc tìm các nhà điều hành dòng quá tải khi tôi đặt trong một kết quả (đó là phụ thuộc vào một templated lớp ngoài). Là những gì tôi đang cố gắng làm thậm chí có thể?

+1

thông báo lỗi diplay là gì bởi trình biên dịch? – Garf365

+2

Chỉ đơn giản là không có cách chung cho trình biên dịch để tìm ra một loại duy nhất để suy ra. – chris

+1

Vấn đề thực tế là loại lồng nhau có thể không phải là duy nhất: 'mẫu < > lớp myclass {using result = myclass :: result'. Trong trường hợp này, hai instantiations chia sẻ một loại lồng nhau duy nhất. – MSalters

Trả lời

13

T không được khấu trừ cho myclass<T>::result.

Bạn có thể xác định operator<< bên trong lớp để giải quyết vấn đề của bạn:

struct result 
{ 
    T value; 


    friend std::ostream& operator<<(std::ostream& stream, const result& res) 
    { 
     return stream << res.value; 
    } 
}; 

Demo

+0

Tuyệt vời, tôi không biết, nó hoạt động! Cảm ơn bạn! –

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