类与重载函数,提问!!!!!!
当函数的实参:
1。类对象
2。指向对象的指针
3。对象的引用
4。指向成员的指针
时,重载函数的候选集大大扩大,类的友元函数加入候选集
现在的问题是:
类定义所在的名字空间的同名函数加入候选集呢(N1),还是类声明所在的名字空间的同名函数加入候选集(N2+N3,定义可以当作声明,声明可以多个)
???声明所在名字空间(多个) or 定义所在名字空间(一个)???
高手指教!!!!!!
代码中的只能看见全局的add,vc6
namespace N3
{
namespace N2
{
namespace N1
{
class A //定义
{
friend void add(){cout < < "friend " < < endl;}
};
void add(A a){cout < < "N1 " < < endl;}
}
using N1::A; //声明
void add(A a, int){cout < < "N2 " < < endl;}
}
}
void add(N3::N2::N1::A , int ,int )
{
cout < < "global " < < endl;
}
int main()
{
N3::N2::N1::A tmp;
add(tmp);//error C2660: 'add ' : function does not take 1 parameters
add(tmp, 1);//error C2660: 'add ' : function does not take 2 parameters
add(tmp, 1, 1);//ok
return 0;
}
[解决办法]
你就是没搞清楚名字空间 :)
[解决办法]
看C++ Primer,关于重载判决的章节,极其详细。
[解决办法]
换一个编译器。
[解决办法]
vc6 没有完全支持标准c++
[解决办法]
声明和定义于此有什么区别呢。“定义”一定同时带一个“声明”的功能。
编译效率需要特别关心吗。
[解决办法]
那又怎么样呢?重要的是它最终找到了哪个函数。
[解决办法]
using N1::A; //声明
这个是不算的
[解决办法]
是在函数正式定义的名字空间里面,这里所说的声明仅仅限于函数定义所在的命名空间的声明。
这里讲的其实就是Koenig Lookup。下面是herb sutter在exceptional c++里面对于koenig lookup的说明:
Koenig Lookup(simplified): If you supply a function argument of class type (here x, of type A::X), then to look up the correct function name the compiler considers matching names in the namespace (here A) containing the argument 's type。
根据koenig lookup,add(tmp)应该是能正确编译的。在vs7.0上确实可以。vc6.0对于c++的标准支持很不到位,好像只有96%。
[解决办法]
注意herb sutter所说的containing the argument 's type,是contain,contain也就是定义了:D
[解决办法]
add(tmp);//error C2660: 'add ' : function does not take 1 parameters
add(tmp, 1);//error C2660: 'add ' : function does not take 2 parameters
-------------------------------------------------
第一个add(tmp);是正确的,不应该出错,符合Koenig查找规则。
第二个add(tmp, 1);是错误的。