2012-01-04 2 views
8

L'esempio seguente illustra un problema più complesso ma non dissimile che ho cercato di risolvere elegantemente. Ho una serie di modelli che devono essere specializzati e, nel fare ciò, implementare una o entrambe le due interfacce: leggibile e scrivibile, in ogni specializzazione. strumenti specifici entrambe le interfacce, e viene poi testata utilizzando principale:Operatore C++() e 'using' Dichiarazione: L'operando sinistro deve essere un errore di valore l

class Readable 
{ 
protected: 

    int values[3]; 

public: 

    Readable() 
    { 
     // Does nothing. 
    } 

    int operator()(int i) const 
    { 
     return values[i]; 
    } 
}; 

class Writable : public Readable 
{ 
public: 

    Writable() 
    { 
     // Does nothing. 
    } 

    using Readable::operator(); 
    int& operator()(int i) 
    { 
     return values[i]; 
    } 
}; 

class Specific : public Writable 
{ 
}; 

void write_test(Specific& specific) 
{ 
    // Error C2106: '=' : left operand must be l-value 
    specific(0) = 1; 
} 

int main() 
{ 
    Specific s; 
    write_test(s); 

    return 0; 
} 

Il codice di cui sopra non riesce a VS 2008, 2010 con il seguente:

error C2106: '=' : left operand must be l-value.

Questo mi sembra strano: sono io trascurato qualcosa di semplice ? Ho compilato ed eseguito esattamente questo codice usando l'operatore [], e tutto andava bene (come dovrebbe ed è sempre stato). Sembrerebbe essere un problema che riguarda specificamente il comportamento di questo operatore, un problema che non conosco.

+0

Compila bene in GCC, indovinando che si tratta di un bug MSVC. – Pubby

+0

Ho modificato il mio post originale perché c'era una certa confusione (colpa mia mentre modificavo furiosamente, senza dubbio) sulla natura del mio problema. –

+2

Hai lo stesso errore con 'int & i = specifico (0); i = 1; ' –

risposta

5

Questo è un errore del compilatore: la dichiarazione di utilizzo dovrebbe funzionare. Per aggirare il problema basta utilizzare la delega:

class Writable: public Readable { 
    ... 
    int operator()(int i) const { return Readable::operator()(i); } 
    ... 
}; 

Questa implementazione è più lungo l'implementazione in realtà delegato a ma evita problemi se la versione in Readable cambia mai.

+0

Grazie Dietmar, questo è quello che ho fatto io stesso, e sembra essere il lavoro più elegante in circolazione. È ancora un problema nel culo, però, e sembra un problema minore nel compilatore (rispetto ad altri). –