2012-03-22 15 views
5

でコンパイルしないでください。(これはすべて私自身のクラスと関数名が置換されているコードを減少さコードは、Visual Studio 2010でコンパイルしますが、次のソースコードは、Visual Studio 2010で正しくコンパイルすべて

namespace NS 
    { 
    class X 
     { 
     }; 
    X Y(X str); 
    } 

void myFun() 
    { 
    NS::X x; 
    Y(x); 
    } 

X、Y、...)

Y(x)は、NS::Y(x)であるため、コンパイルに失敗することが予想されます。

このソースコードはここに含まれ、他のファイルは、他のコマンドラインオプションはありません、次のコマンド

cl /c file.cpp 

でコンパイルされています。

このファイルはなぜコンパイルされますか? VS2010のバグ?あるいは私(そして私の他の3人の同僚)が見落としたことは何ですか?

+1

これをg ++で試してみて、NS :: Y(NS :: X) 'に未定義の参照を持っていたので、VSのバグかもしれません。 – WeaselFox

+2

http://ideone.com/WzC6V –

+0

@WeaselFox :完全に無関係です。 'NS :: Y'が定義されていないため、あなたのエラーは*リンカエラーです*。これは典型的なものであり、完全なセットアップで別のファイルに定義されている可能性があります。 @MatthieuM。 –

答えて

9

あなたが経験しているのはADLArgument Dependent Lookup)です。

(リンカがおそらくNS::Yについて不平を言うという事実以外にも)あなたのスニペットには何も問題はありませんが、VS2012はスニペットを適切に処理しています。

コンパイラは、xNS::X)の型が適切なスコープにあるため、NS::Yが見つかります。


3.4.2実引数依存の名前探索 [basic.lookup.argdep]非修飾名がで後置表現として使用される

  1. 関数呼び出し(5.2.2)、 通常の非修飾ルックアップ(3.4.1)中に考慮されていない他の名前空間が検索され、それらの namespace、namespace-scopeフレンド関数宣言(11.4)ではなく、 が表示されます。

    これらの検索の変更は、 引数(およびテンプレートテンプレート引数の場合は、テンプレート引数の の名前空間)の種類によって異なります。

  2. 関数呼び出しの各引数型Tには、0個以上の関連する名前空間のセットと、考慮する0個以上の一連ののセットがあります。

    名前空間と クラスのセットは、関数引数 の型(およびテンプレートテンプレート引数の名前空間)によって完全に決まります。

+0

あなたはそうです、私はWikipediaでも見つけました。トリッキー。私はこれがうまくいくとは思わなかった。 – Patrick

+0

MSVSやgccのバグですか? –

+2

@LuchianGrigoreバグはありません。スニペットはコンパイルされます。リンカーは 'NS :: Y'の定義を見つけることができません。実行可能ファイルをビルドするには、いくつかの手順があります。 –

関連する問題