2015-08-18 4 views
7

Sto cercando la mia propria implementazione lista concatenata in C++ e non posso per la vita di me capire perché sto avendo questo errore. So che esiste un'implementazione STL ma per ragioni che sto cercando di fare da solo. Ecco il codice:Visual Studio 2015 "la sintassi non standard; usare 'e' di creare un puntatore a membro"

#include <iostream> 

template <class T> 
class ListElement { 
public: 
    ListElement(const T &value) : next(NULL), data(value) {} 
    ~ListElement() {} 

    ListElement *getNext() { return next; } 
    const T& value() const { return value; } 
    void setNext(ListElement *elem) { next = elem; } 
    void setValue(const T& value) { data = value; } 

private: 
    ListElement* next; 
    T data; 
}; 

int main() 
{ 
    ListElement<int> *node = new ListElement<int>(5); 
    node->setValue(6); 
    std::cout << node->value(); // ERROR 
    return 0; 
} 

sulla linea specificata, ottengo l'errore "Sintassi non standard; usare '&' per creare un puntatore a membro". cosa diavolo significa?

risposta

8

Si sta tentando di restituire la funzione membro value, non la variabile membro data. Cambiare

const T& value() const { return value; } 

a

const T& value() const { return data; } 
+8

Wow ..... andare a dormire per me –

+1

@LawrenceAiello Buona fortuna. :) – songyuanyao

0

Il problema qui è la combinazione di modelli confusa, molteplici significati di un operatore, e un errore di battitura.

Si dispone di un metodo che restituisce un const T&, dove T è un parametro di modello. Si intende che per restituire un riferimento costante a un oggetto di tipo T. Ma a causa di un errore di battitura, il compilatore pensa si sta cercando di corrispondere a quello di un metodo (value), piuttosto che un oggetto di tipo T (data). Il compilatore pensa che tu stia cercando di usare & come operatore pointer-to-member, non come operatore reference-to-object. Ma è abbastanza intelligente che qualcosa non è giusto, e quindi dà un avvertimento.