代码之家  ›  专栏  ›  技术社区  ›  Prasoon Saurav

成员函数无法访问私有成员

  •  4
  • Prasoon Saurav  · 技术社区  · 14 年前

    我有以下代码

    #include <iostream>
    #include <string>
    
    template <typename T>
    
    class demo
    {
        T data;
      public:
        demo();
        demo(demo const&k );
        demo(const T&k);
        demo& operator=(const demo &k);
    
        template<typename T1>
        demo(const demo<T1>&k);
    
        template<typename T1>
        demo<T>& operator=(const demo<T1>&k);
    
       ~demo();
    };
    
    template <typename T>
    demo<T>::demo():data(){}
    
    template<typename T>
    demo<T>::demo(demo const& k):data(k.data){}
    
    template<typename T>
    demo<T>::demo(const T&k):data(k){}
    
    template<typename T>
    demo<T>& demo<T>::operator=(demo const &k)
    {
        if ((void*)this == (void*)&k) {    // assignment to itself? 
             return *this; 
            } 
        this->data=k.data;
        return *this;
    }
    
    template<typename T>
      template<typename T1>
      demo<T>& demo<T>::operator=(demo<T1> const &k)
      {
        if ((void*)this == (void*)&k) {    // assignment to itself? 
             return *this; 
            } 
    
        this->data=k.data;
        return *this;
      }
    
    template<typename T>
      template<typename T1>
      demo<T>::demo(const demo<T1>&k):data(k.data){}
    
    template<typename T>
    demo<T>::~demo(){}
    
    int main()
    {
        demo<std::string> k(std::string("hello"));
        demo<std::string >l=k;
        demo<int> x(10);
        demo<double> p=x; //error here
    }
    

    我为什么会在这里出错?据我所知 p 正在将复制初始化为 x . 所以

     demo<T>::demo(const demo<T1>&k):data(k.data){} 
    

    被调用。但自从 data 是私人会员,我会出错 'demo<T>::data' : cannot access private member declared in class 'demo<T>' . 为什么?

    我知道类的成员函数可以访问私有成员,那么为什么我会得到一个错误呢?我应该怎么做来纠正错误?

    2 回复  |  直到 14 年前
        1
  •  8
  •   R Samuel Klatchko    14 年前

    因为 demo<T> demo<T1> 被认为是不同的类型,他们可能无法访问彼此的私有数据。

    解决这个问题的简单方法是添加一个公共访问函数并使用它:

    template <typename T>
    class demo
    {
    public:
        const T &get_data() const { return data; }
        ...
    };
    
    template<typename T>
    template<typename T1>
    demo<T>::demo(const demo<T1>&k):data(k.get_data()){}
    
        2
  •  3
  •   Community CDub    8 年前

    回答如下 R Samuel Klatchko 在我面前, demo<T> demo<T1> 不是同一类型。

    解决问题的方法是声明其他类的朋友:

    class demo
    {
        T data;
      public:
        demo();
        demo(demo const&k );
        demo(const T&k);
        demo& operator=(const demo &k);
    
        template<typename T1>
        demo(const demo<T1>&k);
    
        template<typename T1>
        demo<T>& operator=(const demo<T1>&k);
    
       ~demo();
    
        template<typename T1>   // This will enable demo<T> and demo<T1>
        friend class demo ;     // to see each other's privates as friends
                                // ought to do...
    };