2016-02-26 9 views
7

voglio fare qualcosa di simile:argomento di un template non dedotta per la classe interna

#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"; 
} 

In questo caso né gcc né msvc trovare l'operatore flusso di sovraccarico quando ho messo in un risultato (che dipende da un template classe esterna). Quello che sto cercando di fare è anche possibile?

+1

Qual è l'errore messaggio diplay da compilatore? – Garf365

+2

Semplicemente non esiste un modo generale per il compilatore di calcolare un tipo univoco da dedurre. – chris

+1

Il problema pratico è che il tipo annidato potrebbe non essere univoco: 'modello < > classe myclass {using result = myclass :: result'. In questo caso, due istanze condividono un singolo tipo annidato. – MSalters

risposta

13

T non deducibile per myclass<T>::result.

È possibile definire operator<< all'interno della classe per risolvere il problema:

struct result 
{ 
    T value; 


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

Demo

+0

Fantastico, non lo sapevo, funziona! Grazie! –

Problemi correlati