2015-07-11 7 views
9

Ich habe ein Visual Studio-Projekt, das Dateien mit verwaltetem Code und Dateien mit nicht verwaltetem Code enthält. Das Projekt hat die CLR-Unterstützung, aber wenn ich eine Datei hinzufügen, wo ich nicht brauche .NET ich einfach die/crl Option mit einem Rechtsklick auf die Datei deaktivieren:Option CLR für Header-Datei mit Std :: Mutex deaktivieren

enter image description here

Ich habe eine Klasse das muss nicht verwalteten Code enthalten und std :: mutex verwenden.

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

Ich habe den folgenden Fehler nach dem Kompilieren:

Fehler C1189: #error: nicht unterstützt wird, wenn sie mit /clr oder/clr kompilieren: rein.

Das Problem ist, dass ich die clr für Header-Dateien (.h) nicht deaktivieren die Option, da dies das Fenster ist, wenn ich mit der rechten Maustaste auf eine .h-Datei:

enter image description here

Wie kann ich dieses Problem beheben?

+0

Meine Kristallkugel sagt, dass es keine gute Idee ist diese Klasse in einer .h-Datei zu setzen. Weil Sie auch eine CPP-Datei enthalten, die mit/clr in der Praxis kompiliert wird. Vermeiden Sie das Aussetzen von Klasseninterna mit einer Schnittstelle. –

+0

@HansPassant Ja, ich habe die .cpp-Datei, die Foo.h enthält. Wo ** exaclty ** sollte ich alle in cpp-Dateien enthaltenen Klassen verschieben, in denen ich die clr-Option deaktiviert habe? – Nick

Antwort

6

Es gibt die Möglichkeit, die Problemumgehung zu verwenden, die als Pointer To Implementation (pImpl) idiom bekannt ist.

Es folgt ein kurzes Beispiel:

// 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

Sehr gut, danke! – Aybe