我有两个源文件,a.cpp
and b.cpp
. In a.cpp
,我有一个函数,foo
:
namespace ns { void foo() { std::cout << "foo!"; } }
In b.cpp
,我在命名空间中有另一个函数ns
我想在其中制作原型并调用foo
:
namespace ns
{
void bar()
{
void foo();
foo();
}
}
虽然上面的内容在语法上是有效的,但它会导致编译器认为foo
位于全局命名空间中(或者至少这是我从执行此操作时收到的链接器错误中推断出的)。我解决这个问题的前两个想法是void ns::foo();
and namespace ns { void foo(); }
,但两者都无效。是否可以在内部正确构建此函数的原型bar
?
请注意,我知道我可以简单地将其移动到文件范围或头文件中,对此有很多问题,但我想在另一个函数中专门对其进行原型设计。我的编译器是最新更新的 MSVC 14.0。
EDIT:根据我所做的一些测试以及我们在评论中的讨论,我相信这是一个 MSVC 错误。比较:
namespace ns
{
void bar()
{
void foo(); // link error, MSVC assumes global namespace
foo();
}
void foo() { }
} // namespace ns
如前所述,这会失败。但是,将原型移出函数可以使 MSVC 正确地将原型函数放置在封闭的命名空间中:
namespace ns
{
void foo(); // all fine
void bar()
{
foo();
}
void foo() { }
} // namespace ns