using指令如何影响C ++中的函数参数?

时间:2012-03-26 20:55:21

标签: c++ visual-c++ g++

我有以下代码使用g ++ 4.4.6正常工作,但无法使用Visual Studio 2008进行编译。它似乎与Argument Dependent Lookup有关,所以我认为g ++是正确的。

// testClass.hpp
namespace test {
    class foo {
      public:
        foo(){}
     };

    class usesFoo {
      public:
        usesFoo() {}

        void memberFunc(foo &input);
    };
}

// testClass.cpp
#include "testClass.hpp"

using test::usesFoo;

void usesFoo::memberFunc(foo &input) {
    (void) input;
}

在Visual Studio中编译时出现的错误是

1>编译...
1 GT; testClass.cpp 1> c:\ work \ testproject \ testproject \ testclass.cpp(6):错误C2065:'foo':未声明的标识符 1> c:\ work \ testproject \ testproject \ testclass.cpp(6):错误C2065:'input':未声明的标识符 1> c:\ work \ testproject \ testproject \ testclass.cpp(6):错误C2448:'test :: usesFoo :: memberFunc':函数式初始化器似乎是一个函数定义

我意识到将命名空间直接放在cpp文件中的成员函数上,或者“使用命名空间测试”将解决问题,我更好奇标准在这种情况下所说的内容。

1 个答案:

答案 0 :(得分:1)

代码是正确的,但它与参数相关的查找无关。此外,using声明仅影响usesFoo而不是foo的查找:一旦您说出了类成员的名称,就会在此类的上下文中查找其他名称。由于foo是test :: usesFoo`的成员,因此找到了它。如果没有using指令,您需要像这样定义成员函数:

void test::usesFoo::memberFunction(foo& input) {
    (void)input;
}

相关条款是3.4.1非限定名称查询[basic.lookup.unqual]第6段:

  

在函数的declarator-id之后的函数定义中使用的名称是名称空间N的成员(其中,仅出于说明的目的,N可以表示全局作用域),应该在其使用之前声明。在其中使用它的块或其封闭块(6.3)中的块,或者应该在它在命名空间N中使用之前声明,或者,如果N是嵌套命名空间,则应该在它在N的封闭命名空间之一中使用之前声明。 / p>

依赖于参数的查找仅在调用函数时进入图片,而不是在定义函数时。这些事情完全没有任何关系。