Domanda

Ho un problema relativo ai modelli nidificati e alla sostituzione dell'operatore di assegnazione. Supponiamo di voler avere un modello di classe di riferimento _reference. Questo _reference per ora semplicemente contiene un puntatore all'oggetto contato nuovamente. Il problema ora è che tutto funziona bene, fintanto che lo sto facendo con semplici classi o strutture. per esempio. _reference ...,

Ma ora voglio creare un modello di classe che sia un riferimento a un vettore std che inoltri la classe che contiene.

No, ho appena pubblicato il codice: (non esegue il conteggio e quella roba in questo momento, è solo l'estrazione del problema che ho)

template <typename T>
class _reference
{
private:
    T* p_;

public:

// !!! this assignment seems only to work, when T is no class template already...
void operator= (T* r)                   
{
    p_ = r;
}

// WHILE this ALWAYS works as well...
void simplySetIt (T* r)                 
{
    p_ = r;
}
};

template <typename T>
class _ref_vector : public _reference<vector<T> >
{
};

void test2 ()
{
_reference<vector<long> > ref_ptr2;
_ref_vector<long>         ref_ptr3;

ref_ptr2 = new vector<long>;                    // works fine.

ref_ptr3 = new vector<long>;                // BUT: THIS doesnt work
    ref_ptr3.simplySetIt (new vector<long>);    // WHILE: this works fine...
}

Errore MSVC:

error C2679: binary '=' : no operator found which takes a right-hand operand of type 
'std::vector<_Ty> *' (or there is no acceptable conversion)

Errore GCC:

error: no match for 'operator=' in 'ptr3 = (((const stlp_std::allocator<long int>&)
((const stlp_std::allocator<long int>*)(& stlp_std::allocator<long int>()))), 
(((stlp_std::vector<long int, stlp_std::allocator<long int> >*)operator new(12u)), 
((<anonymous> != 0u) ? (<anonymous>->stlp_std::vector<_Tp, _Alloc>::vector [with 
_Tp = long int, _Alloc = stlp_std::allocator<long int>]
(<anonymous>), <anonymous>) : <anonymous>)))'

Quindi, per favore, qualcuno può spiegarmi perché l'operatore di assegnazione non lavora qui, mentre la funzione simplySetIt - funziona?

È stato utile?

Soluzione

L'operatore di base = viene nascosto dagli operatori di assegnazione impliciti, in modo che non partecipi più al sovraccarico. Devi scrivere _ref_vector come

template <typename T>
class _ref_vector : public _reference<vector<T> >
{
  using _reference<vector<T> >::operator=;
};

Poiché non esiste una versione aggiunta da compilatore di simplySetIt, la ricerca la troverà nella classe base.

Altri suggerimenti

Come dice lo standard (13.5.3):

Perché un operatore dell'operazione di assegnazione della copia = è implicitamente dichiarato per una classe se non dichiarata dall'utente (12.8), un'assegnazione di classe base L'operatore è sempre nascosto dall'operatore di assegnazione della copia dell'operatore classe derivata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top