Ошибка компилятора, связанная с открытым методом, предоставляющим доступ частному члену класса - PullRequest
1 голос
/ 06 июля 2019

С учетом следующих определений шаблонов классов

template<typename T>
class node{
    private:
        T& data;
        shared_ptr<node<T>>& next;
    public:
        T& get_data(void);
        shared_ptr<node<T>>& get_next (void);
    public:
        node(T&);
        ~node();
};

template<typename X>
class list{
    private:
        shared_ptr<X> head;
        list(shared_ptr<X>&);
    public:
        shared_ptr<X>& get_head(void);
        void set_head(shared_ptr<X>&);
    public:
        list();
        ~list();
    public:
        int size (void);
 };

и следующих соответствующих определений методов

template<typename T>
shared_ptr<node<T>>& node<T>::get_next(void){
    return(this->next);
}

template<typename X>
int list<X>::size (void){
    auto h = this->head;
    auto count = 0;

    while(h){
        ++count;
        h = h->get_next();
    }

    return count;
}

И следующего кода в main ()

list<node<string>>menu;
auto num_menu_items = menu.size();

возникает следующая ошибка компилятора:

In instantiation of "int list<X>::size() [with X = node<std::basic_string<char> >]":
error: "std::shared_ptr<node<std::basic_string<char> > >& node<std::basic_string<char> >::next" is private within this context
         h = h->get_next();
             ~~~^~~~
note: declared private here
   shared_ptr<node<T>>& next;

Полный исходный код доступен ниже:

code.hpp

main.cpp

Полный журнал компилятора доступен ниже:

журнал компилятора

Цените ваши мысли.

...