2016-08-24 7 views
-1

私はブーストを使用する前にいくつかのコードを持っています。私は "コア"名前空間で自分のバインド関数(bind1stに似ています)を作成しました。それはうまく動作していました。C++ 11の名前空間の参照がC++ 98から変更されましたか?

しかし、gccに-std = C++ 11を追加すると、多くの用途のbindはcore :: bindの代わりにstd :: bindに解決され、コンパイルエラーを引き起こします。 "bind"のすべての使用を明示的に "core :: bind"に変更することで、動作させることができます。

これは、ネームスペースコア内のすべてのコード、ネストされたネームスペースのコアおよび場所、「using namespace core」で発生します。私のバインド実装内でバインドする "再帰的な"呼び出しでさえ問題があります。

プリプロセッサの出力で "namespace std"を検索しましたが、boostからスワップメソッド内のインスタンスを1つしか見つけられず、core ::の代わりにstd ::からバインドされています。

さらに、gcc-5.3.1ではgcc-4.8.4より多くのエラーが発生しています。

+5

あなたは[mcve]を表示できますか? –

答えて

4

あなたは本当に引数(std::stringstd::vector、などを考える)std名前空間にありますが、私は私の精神的なデバッグのスキルを使用しようと、あなたの問題は、(一部の)例を含んでいることを予測しています、Minimal, Complete, and Verifiable exampleが含まれている必要があります。

Argument Dependant Lookupは、引数がstd名前空間にある場合、std名前空間で関数(bind)が検索されることを意味します。 C++ 03ではそこには見つかりませんでしたので、コンパイラはcoreを見に行きます。 C++ 11の場合、はにあるであるため、コンパイラはこれを使用します。

+1

あなたの精神的なデバッグスキルには引用が必要です。もちろん、あなたはそれを知っていました。 – Yakk

+0

https://blogs.msdn.microsoft.com/oldnewthing/20050321-00/?p=36123 –

関連する問題