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

Posted

技术标签:

【中文标题】using 指令如何影响 C++ 中的函数参数?【英文标题】:How does the using directive affect function arguments in C++? 【发布时间】:2012-03-26 20:55:20 【问题描述】:

我的以下代码使用 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>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) : error C2448: 'test::usesFoo::memberFunc' : function-style initializer 似乎是一个函数定义

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

【问题讨论】:

我看不出有任何理由期望您的代码能够编译; foo 没有在 usesFoo 中定义。有趣的是它是用 g++ 编译的。 memberFunc 不是静态的,foo 是不合格的。 Argument 依赖查找意味着 function 的名称在参数的命名空间中查找,而不是相反。 【参考方案1】:

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

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

与此相关的条款是 3.4.1 Unqualified Name Look-up [basic.lookup.unqual] 第 6 段:

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

参数相关查找仅在调用函数时进入图片,而不是在定义时。这些东西完全没有关系。

【讨论】:

以上是关于using 指令如何影响 C++ 中的函数参数?的主要内容,如果未能解决你的问题,请参考以下文章

《C++ 101条建议》学习笔记——第一章快速入门

C++入门基础

泛函编程—模板函数_类模板

带有“非简单参数”的函数为什么不能包含 "use strict" 指令

如何在 Linux 上使用 c++ 中的系统函数

数组迭代方法—everyfilterforEachmapsome