例如,我有这段代码:
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中测试了这些代码。
答案 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已经被声明了。