2010-07-13 65 views
2

我有这样一个标题:命名空间相同的名称,功能

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

而且我想从全局命名空间访问F2和F1功能。我尝试添加这头结束(或之后包括,无所谓):

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

我敢肯定,这个工程时,函数名从命名空间中的名称不同,但为什么会出现这种不工作,我该如何解决它?谢谢

PS:我不能把这些函数放在他们的命名空间之外,因为这会导致一个重新定义的符号(F2和FL,作为命名空间和函数)。

UPDATE:对于那些诅咒我的人,这就是我所做的。由于这是一个科学公式头文件,并且很难找到一个好的短名称空间名称,所以命名空间为F2和FL,函数本身为f2和fL。

+1

通过使用适当的名称解决这个问题。 IME最好的命名空间名称是名词,最好的功能名称是动词。用英语,这仍然有冲突的余地,但他们少得多。 – sbi 2010-07-13 08:24:21

+0

*使用*将名称带入作用域,因此如果在当前作用域中有该名称的任何内容,编译器将会发出抱怨。 所以,这意味着如果您在当前上下文中定义名称** F2 **的** int **,那么将您的名称空间名称更改为** F_INFINITE **将导致相同的错误。 – 2010-07-13 09:16:21

+0

这与名称空间和函数名称是相同的名称无关,只是它们的声明恰好在相同的范围内。 – 2010-07-13 09:18:12

回答

5

因为,using将带有给定名称的每个声明都带入范围,所以如果您已经有两个或更多具有一个名称的声明(在这种情况下为namespace f1),它会发出抱怨。

它与名称空间和函数的名称没有任何关系。 即使这样也产生了同样的错误:

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

这是更正确的。 – rubenvb 2010-07-13 09:18:29

1

你的问题是“如何从全局命名空间访问F2和FL功能”。

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

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

+0

'错误C2882:'F2':非法使用表达式中的名称空间标识符 – Gunslinger47 2010-07-13 08:35:28

+0

嗨@MSalter,您可以查看我的答案,我有低代表,我需要有经验的人看看它,请节省几秒钟。谢谢。 – 2010-07-13 09:02:17

+0

好的和简洁的答案,一个明显的例子。 – MSalters 2010-07-13 09:55:45

相关问题