【问题标题】:namespace same name as function命名空间与函数同名
【发布时间】:2011-03-15 04:41:11
【问题描述】:

我在标题中有这个:

double commonFunction( ... )
{ /*...*/ }
namespace F2
{
    double impactFactor( ... )
    { /*...*/ }
    double func( ... )
    { /*...*/ }
    double F2( ... )
    { /*...*/ }
}
namespace FL
{
    double impactFactor( ... )
    { /*...*/ }
    double func( ... )
    { /*...*/ }
    double FL( ... )
    { /*...*/ }
}

我想从全局命名空间访问 F2 和 FL 函数。我尝试将其添加到标题的末尾(或在包含之后,没关系):

using F2::F2;
using FL::FL;

我确信当函数名称与命名空间名称不同时这会起作用,但为什么这不起作用,我该如何解决?谢谢

PS:我不能将函数放在它们的命名空间之外,因为这会导致重新定义符号(F2 和 FL,既是命名空间又是函数)。

更新:对于那些诅咒我的人,这就是我所做的。由于这是一个科学公式标题,而且很难找到一个好的短命名空间名称,因此我将命名空间命名为 F2 和 FL,并将函数本身命名为 f2 和 fL。

【问题讨论】:

  • 您可以通过使用正确的名称来解决此问题。 IME 最好的命名空间名称是名词,最好的函数名称是动词。对于英语,这仍然为冲突留下了空间,但它们要少得多。
  • using 将名称带入作用域,因此如果您在当前作用域中有任何使用该名称的东西,编译器会抱怨。因此,这意味着如果您在当前上下文中定义名称为 F2int,则将您的命名空间名称更改为 F_INFINITE 将给您同样的错误。
  • 同样,这与命名空间和函数名同名无关,只是它们的声明恰好在同一范围内。
  • @Gollum:如果函数名 != 命名空间名,我想要的会起作用,问题实际上是由它们具有相同的名称引起的(因为 using 语句!)
  • @rubenvb :它必须有效,因为在这种情况下,您没有两个具有相同名称的符号。命名空间名称和函数名称之间的冲突在同一范围内,如果您更改其中任何一个,它应该可以工作。

标签: c++ namespaces


【解决方案1】:

因为,using 会将每个具有给定名称的声明都带入作用域,所以如果您已经有两个或多个具有同一个名称的声明(在本例中为 namespace f1),它会报错。

并且与命名空间的名称和功能相同无关。 即使这样也会产生同样的错误:

namespace foo
{
    void not_foo(){};
}
namespace not_foo
{
    void foo(){}
}
using not_foo::foo;

【讨论】:

    【解决方案2】:

    您的问题是“如何从全局命名空间访问 F2 和 FL 函数。”。

    这有点模棱两可,因为它可以解释为“如何访问定义在全局命名空间中的 F2 和 FL 函数”。但是从代码中,我认为您的意思是“如何从全局命名空间中的代码访问 ::F2::F2 和 ::FL::FL 函数”

    我想知道您遇到了什么错误。另外,实际的论点是什么?没有这个,我只能猜测。我建议将using 声明更改为using ::FL::FL。尽管如此,在全局命名空间中查找FL 的名称会找到namespace FL,你无法隐藏它。

    【讨论】:

    • error C2882: 'F2' : illegal use of namespace identifier in expression
    • 嗨@MSalter,你能回顾一下我的回答吗,我的代表很低,我需要有经验的人来看看,请花几秒钟。谢谢。
    猜你喜欢
    • 2017-05-31
    • 2010-09-14
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多