2015-05-02 17 views
5

Questo è il mio Snippet:Perché viene utilizzata una funzione non valida anziché una conversione implicita?

class Base{}; 

class Derived : private Base{}; 

template<class T> 
class Wrapper 
{ 
    public: 
     template<typename T2> 
     Wrapper(T2&&) 
     { } 
}; 

// Function declarations 
void func(Base& param); 
void func(Wrapper<Derived>); 
void funcUnambiguous(Wrapper<Derived>); 


// Here is the Call: 
Derived d = Derived(); 
func(d);    // <- Error 

GCC 4.9 mi dà: error: 'Base' is an inaccessible base of 'Derived'

Mentre faccio

Derived d = Derived(); 

funcUnambiguous(d); 

funziona bene.

Sembra che qualsiasi funzione che richiede solo un cast economico, anche se non valida, nasconde le funzioni implicite, ma costose. Qualcuno ha idea?

risposta

5

Aggiornato, grazie a @ T.C. ctor

Wrapper 's è un modello conversione definita dall'utente, quindi la non-templateconversione standard sequenza sovraccarico con Base& prevale. Il controllo di accesso viene eseguito solo dopo il selezionando il sovraccarico, che è troppo tardi nel tuo caso.

Le regole complete sono complicate, altre possono essere trovate here, guarda la sezione "La migliore funzione valida".

+0

Anche se malformato ?! Questo in realtà non rende la decisione, specialmente in questo caso, in cui la classe Base viene esplicitamente resa "privata". –

+0

Vedo, ma non si tratta di un bug nello standard? Non c'è conversione implicita, nemmeno esplicita. Grazie comunque! –

+0

@JakobRiedle La risoluzione del sovraccarico è una delle parti più complicate del C++ (IMHO). Non oserei nemmeno pensare di conoscere tutte le regole in tutti i casi, di sapere cosa sarebbe "giusto" o anche "migliore" o come tutto si sia sviluppato nel tempo. :) Immagino che dovremo accettarlo così com'è. –