2011-10-13 14 views
5

Ciao ho aggiornato il mio Xcode alla versione 4.2 e clang ++ alla versione:clang ++ messaggio di errore quando si utilizza C++ 0x: telefonare al costruttore cancellato di

Apple clang version 3.0 (tags/Apple/clang-211.10.1) (based on LLVM 3.0svn) 
Target: x86_64-apple-darwin11.2.0 
Thread model: posix 

Quando tenta di compilare il seguente codice con clangore -std = C++ 0x

#include <memory> 
#include <limits> 
#include <boost/shared_ptr.hpp> 


class ilpConstraintImpl { 
public: 
    virtual ~ilpConstraintImpl() {} 
}; 


class ilpConstraint { 
public: 
    ilpConstraint(ilpConstraintImpl* implptr):impl(implptr) { } 
public: 
    boost::shared_ptr<ilpConstraintImpl> impl; 
}; 

class ilpExprImpl { 
public: 
    virtual ilpConstraint operator<= (const double rs)=0; 
    virtual ~ilpExprImpl() {} 
}; 



class ilpExpr { 
public: 
    virtual ~ilpExpr() {}; 
    ilpConstraint operator<= (const double rs) { return impl->operator<=(rs); } 
    ilpExpr(ilpExprImpl* implptr):impl(implptr) { } 
    boost::shared_ptr<ilpExprImpl> impl; 
}; 

ottengo il seguente errore:

./test.h:46:54: error: call to deleted constructor of 'ilpConstraint' 
    ilpConstraint operator<= (const double rs) { return impl->operator<=(rs); } 
                 ^~~~~~~~~~~~~~~~~~~~ 
./test.h:28:7: note: function has been explicitly marked deleted here 
class ilpConstraint { 
    ^
1 error generated. 

compilazione senza -std = C++ 0x opere.

risposta

6

Questo mi sembra un bug di clang. Sto lavorando con una versione successiva clang che non ha questo comportamento. Potresti provare a dare a ilpConstraint un costruttore di copie esplicite come soluzione temporanea.

+0

Questo tipo di opere .... l'aggiunta di un costruttore di copia come: \t ilpConstraint (const ilpConstraint & impcon): l'impl (impcon.impl) {} sposta il problema da per shared_ptr con lo stesso messaggio di errore:) – plaisthos

+0

Siamo spiacenti. Potresti provare 'std :: shared_ptr' da libC++. Devi selezionare libC++ sotto le impostazioni della "Libreria standard C++" (non è l'impostazione predefinita). –

+0

Mi sembra di ricordare che c'era un problema con boost shared_ptr con un costruttore di copie cancellato, che si basava su un modello di costruttore per fare la copia e essere favorito. Le versioni successive di boost risolvevano quel problema. –

3

Con supporto C++ 0x i puntatori intelligenti di boost definiscono i costruttori di movimento. Ciò tuttavia disabilita la copia implicita da parte del costruttore di copie e dell'operatore di assegnazione generati automaticamente.

C'è una patch per i puntatori intelligenti di boost che rimonta i costruttori di copia e gli operatori di assegnazione se viene rilevato il supporto per C++ 0x. Può essere trovato qui: https://svn.boost.org/trac/boost/changeset/73202

1

Ho incontrato lo stesso problema, quando uno dei membri della mia classe non aveva più un costruttore predefinito.

struct OrderContact { 
    std::string name; 
    std::string phone; 
    OrderContact() {} // error without this constructor 
    OrderContact(std::string contactName, std::string contactPhone) : name(contactName), phone(contactPhone) { 
    } 
}; 

class Order { 
public: 
    OrderContact contact; 
} 
+1

+1, mi sono imbattuto in questo stesso messaggio di errore oggi e questa è stata la mia causa. –

+0

Stessa cosa, si è imbattuto in questo problema ed è stato corretto con un ctor predefinito – Graeme

+0

Perché il downvote? Per favore, spiegami, sono impaziente di imparare. – Sebastian

Problemi correlati