yak*_*kov 17 c++ namespaces code-duplication
假设我在两个不同的命名空间中定义了方法:
namespace foo
{
void print()
{
//do work...
}
}
namespace bar
{
void print()
{
//do work...
}
}
Run Code Online (Sandbox Code Playgroud)
该foo::print()和bar::print()功能是完全平等的.我的项目使用了这些函数的大量调用.
有没有办法删除其中一个print()定义而不更改这些函数的调用?我的意思是类似下面的东西(当然,C++语言不允许这种结构,它只是一个例子):
namespace foo, bar //wrong code!
{
void print()
{
//do work...
}
}
Run Code Online (Sandbox Code Playgroud)
如果没有办法按我的意愿重构代码,请告诉我,你喜欢以下决定吗?如果您的项目包含此类代码,您会感到高兴吗?:)
namespace foo
{
void print()
{
//do work...
}
}
namespace bar
{
void print()
{
foo::print();
}
}
Run Code Online (Sandbox Code Playgroud)
加:
谢谢你们,我对你的答案非常满意.我想让你澄清一下:using ::foo::print和之间有区别using foo::print吗?
Age*_*ien 18
您可以通过using声明来实现这一目标.
namespace foo
{
void print()
{
//do work...
}
}
namespace bar
{
using foo::print;
}
Run Code Online (Sandbox Code Playgroud)
编辑
对于之间的区别::foo::print和foo::print:前面加上一个限定名::意味着你明确地提到一个全局命名空间.这可以用于选择全局的,即使在范围内有更多具有相同名称的项目.
Ale*_*aev 14
using宣言怎么样:
namespace foo
{
void print()
{
// do work ...
}
}
namespace bar
{
using ::foo::print;
}
Run Code Online (Sandbox Code Playgroud)
使用::foo::print而不是foo::print重要的一点.如果你还有另一个foo内部bar:
namespace foo
{
void print()
{
// 1 ...
}
}
namespace bar
{
namespace foo
{
void print()
{
// 2 ...
}
}
using foo::print; // refers to 2
using ::foo::print; // refers to 1
}
Run Code Online (Sandbox Code Playgroud)
然后你会看到使用的优点::.总而言之,prepending ::是一种安全的方法,可以确保foo将来可能添加的另一个嵌套命名空间不会给您带来任何意外.