首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

类与重载函数,提问!该如何处理

2012-03-16 
类与重载函数,提问!!!!!!当函数的实参:1。类对象2。指向对象的指针3。对象的引用4。指向成员的指针时,重载函数

类与重载函数,提问!!!!!!
当函数的实参:
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);是错误的。

热点排行