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

C++ 如何解决类型名、函数名和参数名之间的名称冲突?,c++,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? } 名称冲突已经解决,但是为什么函数Range()没有名称冲突 顺便说一句,我在VS2010中测试了这些代码。没有Foo::Range

例如,我有以下代码:

struct Range
{
}

struct FooObj
{
     void Range(int x, Range** r){....}     //!< This is OK.
     void Foo(int x, Range** r) {....}      //!< This is Not OK, Why?
}
名称冲突已经解决,但是为什么函数Range()没有名称冲突


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

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

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

int i;

void foo()
{
    int i;

    i = 1; // local variable `i`.
    ::i = 1; // global variable `i`.
}
对。Q.E.D

要使用
结构范围
,只需使用
::范围


(您还需要删除
void Foo(..
)的
void
。它是构造函数。)

声明引入名称。它们引入的名称仅在特定声明点之后可见。该点位于函数声明的参数列表之后。因此,名称
范围
(参考
Foo::Range
)仅在
void Range(int,Range**)/*之后可见
int i;

void foo()
{
    int i;

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