不确定此问题是否曾被提出过。我四处搜索,找不到我的方案的确切答案,但我可能错过了它。
问题:我在头文件中有一个命名空间,头文件中的命名空间内有一些函数原型:
namespace Foo{
namespace{
RNG rando = new RNG();
}
void SomeFunc(){
//implementation
}
void SomeOtherFunc(){
//implementation
}
}
在.cpp文件中,我想在命名空间中定义函数,同时还为一个随机数生成器提供一些保护,它们都依赖于匿名命名空间:
namespace Foo{
namespace{
RNG rando = new RNG();
}
}
void Foo::SomeFunc(){
//implementation
}
void Foo::SomeOtherFunc(int){
//implementation
}
我遇到的问题是,无法保证头文件中的原型与我在cpp文件中定义的函数相匹配。命名空间{}代码块中的所有内容都可以是添加到命名空间的新内容。
在上面的代码示例中,SomeOtherFunc()是在没有int类型的参数的情况下实现的,但是它的声明表明它需要一些参数。实际上,似乎我重载了SomeOtherFunc()签名。
我可以在cpp文件中使用以下内容:
{{1}}
编译器似乎强制执行函数声明和实现之间的关系,我喜欢这样。但是,这些函数似乎无法访问匿名命名空间内的数据。
我在这里遗漏了什么吗?我能做些什么来解决我认为在这个实现中存在的问题?我不是很精通使用(匿名)命名空间,所以如果这看起来很基本,我会道歉。
答案 0 :(得分:3)
将未命名的命名空间移出另一个命名空间:
namespace{
RNG rando = new RNG();
}
void Foo::SomeFunc(){
//implementation
}
void Foo::SomeOtherFunc(int){
//implementation
}
无论如何都无法在翻译单元外访问。
答案 1 :(得分:2)
通常的惯例是,据我所知,在.cpp文件的开头声明匿名命名空间。在您的情况下,您的cpp文件应如下所示。
namespace{
RNG rando = new RNG();
}
void Foo::SomeFunc(){
//implementation
}
void Foo::SomeOtherFunc(int){
//implementation
}
这样,函数应该可以访问rando。
答案 2 :(得分:0)
匿名命名空间是一个红色的鲱鱼。你可以忽略它,字面上一个实现细节。
是的,您可以从.cpp文件中的标头重载函数。但是,如果您尝试使用该对中未定义的一半,则会出现链接器错误。