не может получить доступ к закрытому члену, объявленному в ошибке класса во время создания шаблона - PullRequest
6 голосов
/ 04 октября 2010

Мой код выглядит следующим образом

template <typename T>

class name
{
public:
    name() : h_(0){}

    template <typename U>
    operator name<U>()
    {
        name<U> u;
        u.h_ = h_;
        return u;
    }
private:
    int h_;
};

int main(void)
{
    name<int> a;
    name<double> b = a;
    return 0;
}

Я получаю ошибку int name<double>::h_ is private. Как исправить ошибку?

Ответы [ 6 ]

7 голосов
/ 04 октября 2010

name<int> и name<double> - это разные экземпляры и, следовательно, фактически разные классы.Их личные участники не могут быть разделены по умолчанию.Вам нужно сделать name<T> друга для всех остальных name.

template <typename T>

class name
{
public:
    name() : h_(0){}

    template <typename U>
    operator name<U>()
    {
        name<U> u;
        u.h_ = h_;
        return u;
    }
private:
    int h_;
    template <typename>   // <--
    friend class name;   // <--
};

int main(void)
{
    name<int> a;
    name<double> b = a;
    return 0;
}
3 голосов
/ 04 октября 2010

name<int> пытается получить доступ к приватному члену name<double>. Вы сможете исправить это, сделав функцию преобразования другом, но компиляторы, которые я пробовал , будут безрезультатными, если вы попытаетесь .

Вы можете также сделать любого name<T> другом name<U>, чтобы это исправить.

template <typename T>
class name
{
public:
    name() : h_(0){}

    template <typename U>
    operator name<U>()
    {
        name<U> u;
        u.h_ = h_;
        return u;
    }

    template<typename U>
    friend class name; // <----

private:
    int h_;
};
2 голосов
/ 04 октября 2010

name<T> и name<U> рассматриваются компилятором как два разных класса, и это не позволяет вам получать доступ к закрытым членам другого класса.Как это исправить?Либо переделать, либо подарить дружбу.Или предоставьте доступ ... Есть много способов сделать это, наиболее подходящий из них зависит от ваших намерений.Если я правильно угадаю твои намерения, хорошей идеей может быть предоставление дружбы, но я не вижу всей картинки из кода, который ты отправил.

1 голос
/ 04 октября 2010

Вам нужно будет добавить сеттеры / геттеры (или дружбу, или что-то еще).Проблема в том, что name<T> и name<U> являются полностью несвязанными классами.

В качестве альтернативы, почему бы вам просто не добавить еще один конструктор name(const T &h) : h_(h) {}?

0 голосов
/ 04 октября 2010

Name<T> потенциально является типом, отличным от Name<U>, поэтому применяются правила инкапсуляции. Используйте аксессоры или друзей.

0 голосов
/ 04 октября 2010

name<T> может отличаться от name<U> [например: в вашем случае].Следовательно, один не может получить доступ к закрытым членам другого [в случае, если T и U - это разные типы].

Добавьте следующее в определение класса.

template<typename U>
 friend class name;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...