Ошибка разыменования указателя элемента: не может использоваться как указатель элемента - PullRequest
0 голосов
/ 24 октября 2011

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

template <typename T>
class btree 
{
    public:

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

    private:

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

        btree_node* headNode;
}

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

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

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

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

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

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

Ответы [ 3 ]

5 голосов
/ 24 октября 2011

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

headNode = new btree_node(*(original.headNode))
3 голосов
/ 24 октября 2011

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

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

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

*original.headNode
2 голосов
/ 24 октября 2011

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

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