2013-05-03 13 views
5

Czy korzystanie z std::tr1::shared_ptr jest zgodne z prawem i dobrym stylem programowania jako std::shared_ptr umieszczając dyrektywę using w odpowiednim nagłówku? W ten sposób:Czy umieszczanie pliku tr1 :: shared_ptr w przestrzeni nazw w nagłówku jest legalne?

namespace std 
{ 
    using tr1::shared_ptr; 
} 

Wiem, że zanieczyszczanie całego obszaru nazw jest złe, ale co z tą sprawą? Czy są jakieś ukryte pułapki? Docelowym kompilatorem jest VS2008, ale pożądana jest również kompatybilność z nowszymi wersjami.

+3

[Późniejsze wersje powinny również obsługiwać 'std :: tr1'] (http://stackoverflow.com/a/2002972/241631). Kompilatory nie zrzutu całego obszaru nazw; będą kopiować rzeczy z tego na 'std', tak jak próbujesz to zrobić. Odwoływanie się do typu jako 'std :: tr1 :: shared_ptr' nie powinno być problemem przez długi czas. – Praetorian

+0

@cassini Co powiedział pretorian^Jeśli chciałbyś pójść swoją trasą, musiałbyś przeprowadzić kontrole kompilatora w preprocesorze, aby upewnić się, że nie pojawią się konflikty w obsłudze C++ 11 i przyszłych kompilatorach, które są niechlujne i nie jest to elastyczne i nie tak przenośne. – leetNightshade

+1

@leetNightshade Właściwie to wszystko powyższe. Oczywiście, niestety nie ma opcji "kompilator obsługuje funkcję X", ale dla większości celów powinno wystarczyć proste sprawdzenie preprocesora dla wersji C++. –

Odpowiedz

3

Technicznie Standard mówi, że wchodzi w sferę zachowanie niezdefiniowane, jeśli to zrobić:

17.6.4.2.1 namespace std [namespace.std]

1 Zachowanie program C++ jest nieskończony, jeśli dodaje deklaracje lub definicje przestrzeni nazw lub przestrzeni nazw w przestrzeni nazw std , chyba że podano inaczej.

Ale w praktyce najprawdopodobniej uszło ci to na sucho. Heck, nawet Scott Meyers zaproponował podobnie niezdefiniowaną sztuczkę aliasu przestrzeni nazw w Effective C++ 3rd Ed. (Poz. 54, str.268), aby użyć funkcji Boost jako zapory dla braku funkcji tr1.

namespace std { using namespace tr1 = ::boost; } 

Twoja deklaracja użyciu jest także niezdefiniowane zachowanie, ale iść do przodu i skok w prawo w

. UWAGA: skomentować go z wielkim ostrzeżeniem tłuszczu #define i #pragma wokół swojej wersji kompilatora i ostrzeżenia, a gdy tylko podczas uaktualniania do kompilatora/biblioteki, która faktycznie ma wartość std::shared_ptr, należy ponownie odwiedzić ten nagłówek i usunąć kod.

+0

Aby dodać do ostatniej notatki: Komentarze są ładne i wszystkie . Jednak są to po prostu takie, komentarze. Jeśli chcesz czegoś z nieco bardziej przekonującymi mocami, użyj zamiast tego dyrektyw preprocesora. Coś na wzór #if zdefiniowanego (_MSC_VER) && (_MSC_VER> 1500) #error Proszę powtórzyć poniższy kod. #endif prawdopodobnie wywoła jakiś rodzaj akcji, gdy będzie to właściwe. – IInspectable

+0

@Tim tnx, dobry punkt. Zaktualizowano! – TemplateRex

+0

Dziękuję, ale nie chciałbym wracać do tego kodu po aktualizacji do nowego kompilatora. – cassini

Powiązane problemy