2015-07-11 11 views
9

Possiedo un progetto Visual Studio che contiene file con codice gestito e file con codice non gestito. Il progetto ha il supporto CLR, ma quando aggiungo un file in cui non ho bisogno di .NET Ho semplicemente disattivare l'opzione/CRL con un clic destro sul file:Disattiva l'opzione clr per il file di intestazione con std :: mutex

enter image description here

ho aggiunto una classe che deve contenere codice non gestito e usare std :: mutex.

// Foo.h 
class Foo 
{ 
    std::mutex m; 
} 

ho ottenuto il seguente errore dopo la compilazione:

errore C1189: #error: non è supportato quando si compila con /CLR o/CLR: puro.

Il problema è che non ho la possibilità di spegnere il CLR per i file di intestazione (h), dal momento che questa è la finestra quando right-click su un file .h:

enter image description here

Come posso risolvere questo problema?

+0

La mia sfera di cristallo dice che non era una buona idea mettere questa classe in un file .h. Perché anche tu includi un file .cpp che viene compilato con/clr in effetti. Evitare di esporre interni di classe con un'interfaccia. –

+0

@ HansPassant sì, ho il file .cpp che include Foo.h. Dove ** esaclty ** dovrei spostare tutte le classi incluse nei file cpp in cui ho disabilitato l'opzione clr? – Nick

risposta

6

Esiste la possibilità di utilizzare la soluzione nota come Pointer To Implementation (pImpl) idiom.

segue è un breve esempio:

// Foo.h 
#include <memory> 

class Foo 
{ 
public: 

    Foo(); 

    // forward declaration to a nested type 
    struct Mstr; 
    std::unique_ptr<Mstr> impl; 
}; 


// Foo.cpp 
#include <mutex> 

struct Foo::Mstr 
{ 
    std::mutex m; 
}; 

Foo::Foo() 
    : impl(new Mstr()) 
{ 
} 
+3

Molto bene, grazie! – Aybe