C++ using指令如何影响C++;?

C++ using指令如何影响C++;?,c++,visual-c++,g++,C++,Visual C++,G++,我有以下代码,在使用g++4.4.6时运行良好,但在使用VisualStudio2008时编译失败。它似乎与参数相关的查找有关,所以我认为g++是正确的 // testClass.hpp namespace test { class foo { public: foo(){} }; class usesFoo { public: usesFoo() {} void memberFunc(foo

我有以下代码,在使用g++4.4.6时运行良好,但在使用VisualStudio2008时编译失败。它似乎与参数相关的查找有关,所以我认为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> testClass.cpp 1> c:\work\testproject\testproject\testclass.cpp(6):错误C2065:“foo”:未声明的标识符 1> c:\work\testproject\testproject\testclass.cpp(6):错误C2065:“输入”:未声明的标识符 1> c:\work\testproject\testproject\testclass.cpp(6):错误C2448:“test::usesFoo::memberFunc”:函数样式初始值设定项似乎是函数定义


我意识到,要么将名称空间直接放在cpp文件中的成员函数上,要么“使用名称空间测试”将解决这个问题,我更想知道标准在这种情况下到底说了什么。

代码是正确的,但它与依赖参数的查找无关。另外,using声明只影响
usesFoo
的查找,而不影响
foo
:一旦说出类成员的名称,就会在该类的上下文中查找其他名称。因为
foo
是test::usesFoo`it found的成员。如果没有using指令,则需要如下定义成员函数:

void test::usesFoo::memberFunction(foo& input) {
    (void)input;
}
相关条款为3.4.1非限定名称查找[basic.lookup.unqual]第6段:

在函数的声明器id之后的函数定义中使用的名称是命名空间N的成员(其中,仅为了说明的目的,N可以表示全局范围),应在使用该名称的块或其一个封闭块(6.3)或,应在名称空间N中使用之前声明,或者,如果N是嵌套名称空间,则应在其在N的一个封闭名称空间中使用之前声明


依赖于参数的查找仅在调用函数时进入画面,而不是在定义函数时进入画面。这些东西之间根本没有任何关系。

我看不出有任何理由期望您的代码能够编译;未在usesFoo中定义foo。有趣的是,它是用g++编译的。
memberFunc
不是静态的,而且
foo
是不合格的。依赖于参数的查找意味着在参数的命名空间中查找函数名,而不是相反。