2010-07-14 106 views
4

我有下面的代码成员函数不能访问私有成员

#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>'。为什么?

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

回答

8

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

解决这个Easist方式是通过增加公共存取功能,并使用它:

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()){} 
3

正如我之前回答R Samuel Klatchkodemo<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... 
};