如何解决类型名称,函数名称和参数名称之间的名称冲突?

时间:2014-06-27 08:31:49

标签: c++

例如,我有这段代码:

struct Range
{
}

struct FooObj
{
     void Range(int x, Range** r){....}     //!< This is OK.
     void Foo(int x, Range** r) {....}      //!< This is Not OK, Why?
}

然后我将函数Foo(int,Range **)修复为:

void Foo(int x, struct Range** r){...}

名称冲突已经解决,但为什么函数Range()没有名称冲突?

顺便说一句,我在VS2010中测试了这些代码。

2 个答案:

答案 0 :(得分:1)

因为::Foo::Range隐藏::Range。看看这个更简单的例子:

int i;

void foo()
{
    int i;

    i = 1; // local variable `i`.
    ::i = 1; // global variable `i`.
}

是。 Q.E.D。

要使用struct Range,只需使用::Range

(而且您还需要移除void的{​​{1}}。它是构造函数。live example

答案 1 :(得分:0)

没有Foo :: Range的前向声明(没有头文件),因此在编译Foo :: Range时没有名称冲突。但是当编译Foo :: Foo时,Foo :: Range已经被声明了。