2012-03-22 47 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?還是我(和我的另外三個同事)忽略的東西?

+1

用g ++試過這個,並得到了'NS :: Y(NS :: X)'的未定義引用' - 所以也許它可能是VS中的一個錯誤.. – WeaselFox 2012-03-22 09:53:22

+2

http://ideone.com/WzC6V – 2012-03-22 09:59:14

+0

@WeaselFox :完全無關。您的錯誤是*鏈接器錯誤*,因爲沒有定義NS :: Y。這是典型的,可能會在另一個完整的設置文件中定義。 – 2012-03-22 10:52:11

回答

9

什麼,你遇到的是由於ADLArgument Dependent Lookup)。

你的代碼段沒有什麼問題(除了鏈接器可能會抱怨NS::Y未被定義),但它應該編譯 - VS2012正在處理代碼段。

由於參數xNS::X)的類型在適當的範圍內,編譯器會發現NS::Y


3.4.2參數依賴性名稱查找 [basic.lookup.argdep]

  1. 當不合格的名稱是在用作後綴表達式 函數調用(5.2.2)中,通常 不合格查找(3.4.1)中不考慮其它的命名空間可被搜索,並且在那些 名稱空間,名稱空間範圍朋友函數聲明(11.4)不 否則可見可以找到。

    這些對搜索的修改取決於參數 的類型(以及模板參數, 模板參數的名稱空間)。

  2. 對於函數調用中的每個參數類型T,都有一組零個或多個關聯的名稱空間和一組零個或多個要考慮的關聯類。

    命名空間和 類的集合完全由函數參數 (以及任何模板模板參數的命名空間)的類型決定。

+0

你說得對,我也在維基百科上發現它。棘手。我沒有想到這會起作用。 – Patrick 2012-03-22 10:00:46

+0

那麼它是MSVS還是gcc中的錯誤? – 2012-03-22 10:01:36

+2

@LuchianGrigore沒有錯誤,代碼片段編譯。鏈接器找不到'NS :: Y'的定義。構建可執行文件時有幾個步驟。 – 2012-03-22 10:03:23

相關問題