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`.
}