Функция-член не может получить доступ к приватному члену - PullRequest
4 голосов
/ 14 июля 2010

У меня есть следующий код

#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 ]

8 голосов
/ 14 июля 2010

Поскольку 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()){}
3 голосов
/ 14 июля 2010

Как ответил R Самуэль Клатчко до меня, 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...
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...