#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, который не является указателем, и, следовательно, не будет иметь смысла