我用vc6编译《c++ primer plus》第四版 中文版第364页程序12.4的时候出现了问题:
我按照书上代码输入,vc6编译的时候却提示:
String.cpp(80) : error C2248: 'str' : cannot access private member declared in class 'String'
竟然不允许我的友元函数访问私有变量,我可是把函数声明成了友元呀!
不过用g++确可以编译,奇怪!!
源码在这儿:
http://kuga.51.net/temp/cpp1.zip

解决方案 »

  1.   

    有人对VC++6,BCB,G++等编译器做了测试,发现VC++6是对标准支持得最少的一个
      

  2.   

    我觉得也是,不过《c++ primer plus》的作者说在vc6能通过编译的,而且网上的其他一些教材也是这么讲操作符重载的
      

  3.   

    做内联函数即可解决
    如:
    friend bool operator < ( String &st, String &st2){
    return (strcmp(st.str,st2.str)<0);
    }
      

  4.   

    to  wiler(贼狼) :
    要全部做成内联吗?
      

  5.   

    to  wiler(贼狼) :
    要全部做成内联吗?
    要是有的函数比较大怎么办?
      

  6.   

    to gxcoo(gxcooo) :
    VC中就这样的了,没办法
    好象支持得不好
      

  7.   

    to  wiler(贼狼) :
    vc7可不可以?
      

  8.   

    奇怪了
    我这样的测试程序又对
    class String{
    char *str;
    public:
    String(char *s){
    str=(char *)malloc(sizeof(char)*strlen(s));
    strcpy(str,s);
    }
    friend int operator < (const String &s1,const String &s2);
    ~String(){
    if(str)
    free(str);
    }
    };
    int operator < (const String &s1,const String &s2){
    return(strcmp(s1.str ,s2.str ));
    }
      

  9.   

    哪里有《c++ primer plus》第四版 中文版下载?
      

  10.   

    to wiler(贼狼):
    问题解决了,vc6对 using namespace std 支持的不好。
    把String类头文件里的
    using namespace std 
    改成:
    using std::istream;
    using std::ostream;
      

  11.   

    to wiler(贼狼) :
    怎样结束问题?我好把分给你呀!