在同一命名空间中调用C++函数
C++ function call within same namespace
在实现中使用"using namespace"关键字时,从同一命名空间的另一个函数调用一个函数的正确方法是什么?我得到以下错误:
对"bar"的调用不明确
编译时:
// Foo.h
namespace Foo
{
void bar();
void callBar();
}
// Foo.cpp
#include "Foo.h"
using namespace Foo;
void bar() {/* do something */}
void callBar() {bar();}
您似乎正在cpp文件中提供bar
和callBar
的定义。在这种情况下,应该将函数放在声明它们的名称空间Foo
中,而不是使用using
:导入该名称空间
#include "Foo.h"
namespace Foo {
void bar() {/* do something */}
void callBar() {bar();}
}
using namespace
指令告诉编译器,您希望调用函数并引用命名空间Foo
中的类,而不显式限定它们的名称;文件中可以有多个这样的指令。它不会告诉编译器您在下面提供的定义应该属于命名空间Foo
,因此编译器会将它们转储到顶级命名空间中。
最终的结果是编译器看到两个bar
——Foo::bar()
在Foo
命名空间中声明,具有外部定义,::bar()
在默认命名空间中的cpp文件中定义。
这里有两个bar
。一个在命名空间Foo
中声明但未定义,另一个中声明并定义。两者都可以从调用站点访问,因为您使用的是using namespace Foo;
,因此编译器存在歧义。
如果函数的定义是为Foo
命名空间中的函数定义的,那么您也应该将它们放在那里。
namespace Foo {
void bar() {/* do something */}
void callBar() {bar();}
}
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 没有为自己的结构调用列表推回方法
- 调用'begin(int [n])'没有匹配函数
- 什么时候调用析构函数
- 如何用参数值调用函数(仅在运行时已知)
- std::cout.imbue()多重调用
- 函数何时会在c++中包含stack_Unwind_Resume调用