@evensun
我猜你的疑问应该是,为什么类似下面这段代码编译器会报错?
1 pressureReference pressureReference(p, simple.dict());
2 pressureReference pressureReference(pf, simple.dict());
这两条语句有4个pressureReference,我分别编号为1, 2, 3和4号。
编译器运行到第一行代码时,假设当前函数体内没有声明pressureReference,编译器就会首先去全局域(global )里寻找pressureReference是什么,当找到pressureReference的声明,发现是个类时,编译器把它(1号)解析为一个类(class)。
编译器继续运行,遇到2号pressureReference,编译器主动构造类型为pressureReference(1号)的对象pressureReference(2号)。
注意:这两个名称一样,编译器会怎么做?当前作用域里的pressureReference(2号)会把全局域(global)里的pressureReference(1号)隐藏掉,1号就发挥不了作用了。也就是说,在此后的作用域里pressureReference只是个对象,只发挥2号pressureReference的作用。
编译器继续运行,遇到第二行的3号pressureReference,此时编译器将这个pressureReference解析为一个对象(2号)。
编译器最后发现4号pressureReference,这是什么,3号对象后面一个4号对象,蜜汁操作,编译器理解不了,编译就失败了。
那如果我一定要让3号pressureReference发挥类(class)的作用(像1号pressureReference一样),有没有办法?
有的。在第二行代码的3号前加作用域解析运算符(::),编译器就会去找全局(global)的pressureReference声明了,像上面的第一步一样,然后把3号解析为类(class),再把4号理解为对象。编译就能通过了。
有兴趣可以试试。
1 pressureReference pressureReference(p, simple.dict());
2 ::pressureReference pressureReference(pf, simple.dict());