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++ 中的函数参数?的主要内容,如果未能解决你的问题,请参考以下文章