Ошибка разыменования указателя на член: не может использоваться в качестве указателя на член

#c #class #pointers #dereference

#c #класс #указатели #разыменование

Вопрос:

У меня есть следующее (усеченное) объявление класса:

 template <typename T>
class btree 
{
    public:

        btree(const btree<T>amp; original); //This is btree's copy constructor

    private:

        struct btree_node 
        {
            btree_node(const btree_node amp;other)
            {
                //This is node's copy constructor
            }
        }

        btree_node* headNode;
}
 

И конструктор копирования btree реализован таким образом:

 template <typename T> 
btree<T>::btree(const btree<T>amp; original)
{
    headNode = new btree_node(original.*headNode);
}
 

предполагается, что original.*headNode возвращает btree_node, на который указывает original.headNode, таким образом, сопоставляя аргументы конструктора копирования btree_node.

Однако я получаю следующую ошибку:

ошибка: ‘((btree *) this)-> btree:: headNode’ не может использоваться в качестве указателя на член, поскольку он имеет тип ‘btree::btree_node *’

Что я делаю не так?

Ответ №1:

Если вы посмотрите на таблицу приоритетов, вы увидите, что сначала вычисляется . оператор, а затем * вычисляется оператор (разыменования).

* принимает указатель в качестве аргумента. Если вы пишете original.*headNode , это бессмысленно. Каким-то образом вы сообщаете ему, чтобы он получил член *headNode original , но *headNode не является членом original . Вы также указываете ему, чтобы он оценил *headNode , что на самом деле *this->headNode (обратите внимание, что -> оценивается первым).

Вы хотите сначала получить указатель путем записи original.headNode , а затем разыменовать его с помощью * . Поэтому

 *original.headNode
 

Ответ №2:

Попробуйте это:

 headNode = new btree_node(*(original.headNode))
 

Ответ №3:

Я предполагаю, что вы хотите на самом деле

 headNode = new btree_node( *original.headNode );
 

Комментарии:

1. Да, это действительно то, что я хотел! Глупая ошибка. Спасибо! Я подумал, что если я сделаю *original.headNode, то это приведет к разыменованию original, который не является указателем, и, следовательно, не будет иметь смысла