2012-03-22 48 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

相关问题