2013-05-03 11 views
5

std::tr1::shared_ptrstd::shared_ptrとして使用することは合法で良好なプログラミングスタイルですかusingディレクティブを対応するヘッダーに配置しますか?このように:ヘッダーの名前空間stdにtr1 :: shared_ptrを使用して配置することはできますか?

namespace std 
{ 
    using tr1::shared_ptr; 
} 

名前空間全体を汚染するのは悪いことがわかりますが、このケースはどうですか?隠された落書きはありますか?ターゲットコンパイラはVS2008ですが、それ以降のバージョンとの互換性も求められます。

+3

[それ以降のバージョンも 'std :: tr1'をサポートしているはずです(http://stackoverflow.com/a/2002972/241631)。コンパイラは名前空間全体を削除しません。あなたがしようとしているのと同じように、それらを 'std'にコピーします。したがって、 'std :: tr1 :: shared_ptr'という型を参照することは、長い間問題になってはいけません。 – Praetorian

+0

@カッシーニPraetorianが言ったこと^あなたがあなたのルートに行きたいなら、プリプロセッサでコンパイラのチェックをして、C++ 11をサポートしているコンパイラと将来のコンパイラが混乱しないようにする必要があります。フレキシブルではなく、移植可能ではありません。 – leetNightshade

+1

@leetNightshade実際には、上記のすべてです。確かに残念ながら、「コンパイラは機能Xをサポートしています」というチェックはありませんが、大部分の目的で、C++バージョンの単純なプリプロセッサチェックで十分です。 –

答えて

3

技術的には、標準では、あなたがこれを行う場合は、未定義の動作のレルムを入力することを言う:

17.6.4.2.1名前空間std [namespace.std]

1の挙動特に指定がない限り、C++プログラムは宣言を追加するか、名前空間stdまたはnamespace std 内の名前空間に定義を追加するかは定義されていません。

しかし実際には、あなたはそれを乗り越える可能性があります。 Heck、Scott MeyersもEffective C++ 3rd Edで同様の定義されていない名前空間エイリアストリックを提案しました。 (アイテム54、p.268)を使用して、tr1の機能が不足しているための機能停止のための機能を使用します。

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

あなたの使用して宣言も未定義の動作ですが、先に行くと右にジャンプ

注:。できるだけ早く、大きな脂肪の警告であなたのコンパイラのバージョンと警告周り#define#pragmaそれをコメントし、実際にstd::shared_ptrのコンパイラ/ライブラリにアップグレードするときには、そのヘッダを再訪してコードを削除してください。

+0

最終的な注釈に追加するにはコメントはすてきですべてです。しかし、彼らはちょうどそのようなコメントになりがちです。あなたが少し説得力のあるものを望むなら、代わりにプリプロセッサ指令を使用してください。 #if defined(_MSC_VER)&&(_MSC_VER> 1500)の行に沿ったもの#error次のコードを再訪してください。 #endifはおそらく適切なときに何らかのアクションをトリガーします。 – IInspectable

+0

@Tim tnx、良い点。更新しました! – TemplateRex

+0

ありがとうございますが、私はこのコードを新しいコンパイラにアップグレードした後に再訪したくありません。 – cassini

関連する問題