Конструктор копирования — ошибка компилятора C2040 и C2440

Я получаю несколько ошибок компилятора, которые происходят из моего Copy-Constructor. Я понимаю, что первая ошибка происходит из-за несовместимых типов операндов, я просто не уверен в лучшем способе написания этого кода. И вторая ошибка, в которой я совсем не уверен. Почему бы не '=' быть в состоянии преобразовать из Узла * в Узел *?

Любая помощь или направление будут оценены.

Спасибо!

// Copy-Constructor
List::List(const List& theList)
{
Node* tempPtr = new Node;
tempPtr = theList.first;

//error C2040: 'tempPtr' : 'List' differs in levels of indirection from 'Node *'
List(tempPtr);

while (tempPtr != NULL)
{
Node* copyNode = new Node;

//error C2440: '=' :cannot convert from 'Node *' to 'Node *'
copyNode = tempPtr;

tempPtr = tempPtr->getNext();
nodeListTotal++;
}
}

Ниже мой конструктор и деструктор.

List::List():first(0), last(0), nodeListTotal(0)
{
}

// Destructor
List::~List()
{
Node* currentNode = first;

while(currentNode != NULL)
{
Node* temp = currentNode;
currentNode = currentNode->getNext();
delete temp;
}
}

0

Решение

Здесь есть несколько проблем. Во-первых, C2040 и C2440, где типы одного типа. На основании того, что я нашел в этой дискуссии, круглые скобки разрешены в объявлении, поэтому утверждение:

List(tempPtr);

по-видимому, эквивалентно:

List tempPtr;

Следовательно, ошибка — это очень запутанный способ сказать, что вы объявили переменную tempPtrи вы дали ему другой тип. Но учтите, что если вы написали List*(tempPtr) было бы сказать redefinition: different basic typesтак что это также, похоже, связано с тем, что List не столько указатель, сколько Node* (вот откуда берется «уровень косвенности»). C2440 происходит из-за повторного объявления. Вы можете подтвердить это, комментируя List(tempPtr); и увидев, что код скомпилируется. Однако тот факт, что он будет компилироваться, вовсе не означает, что это правильно.

Проблема № 2 в том, что вы не показываете здесь конструктор, принимающий Node*и даже если бы у вас был один, это не будет правильным способом назвать это. Я не совсем уверен, что вы пытаетесь сделать с этим.

Проблема № 3 в том, что вы протекаете Node объекты как сумасшедшие. Когда вы выполняете строки:

Node* tempPtr = new Node;
tempPtr = theList.first;

а также

Node* copyNode = new Node;
copyNode = tempPtr;

вы распределяете Node объекты, а затем выбрасывая указатели на них. Если вы пытаетесь скопировать Node объекты, это не способ сделать это. Вам тоже нужен конструктор копирования.

Это не все, что входит в правильный конструктор копирования для вашего List класс, но он покрывает некоторые из самых больших проблем с кодом, который вы разместили, и, особенно, кажется, именно поэтому вы получаете эти две ошибки.

0

Другие решения

Ситуация выглядит как сочетание какого-то недопонимания с вашей стороны и ошибки компилятора.

Формально заявление

 List(tempPtr);

должен интерпретироваться компилятором как объявление

 List tempPtr;

В спецификации языка 6.8 (C ++ 03) четко указано, что неоднозначность между объявлением и функциональным выражением приведена в пользу или объявлении. Это означает, что у вас есть недопустимая переопределение переменной tempPtr, Вы уже заявили tempPtr раньше с другим типом.

Тем не менее, сообщение об ошибке, выдаваемое компилятором, похоже, предполагает, что компилятор интерпретировал его как функциональное выражение приведения (вместо объявления). Это выражение пытается создать безымянный временный объект типа List из указателя tempPtr типа Node *, Этот временный объект (если он успешно создан) будет немедленно уничтожен. Тем не менее, класс List не имеет конструктора, который может построить его из Node * указатель. Это то, что говорит вам компилятор. Твой класс List имеет только один однопараметрический конструктор, который принимает const List &в то время как вы поставили Node *, Компилятор говорит вам, что не может конвертировать Node * в List чтобы вызвать этот конструктор.

Тем не менее, независимо от того, как кто-то интерпретирует это утверждение (выражение или объявление), это не имеет смысла в контексте вашего кода. Это сломано в любом случае. Итак, в основном, вопрос в том, что на Земле вы пытаетесь делать с этим List(tempPtr); линия? Каково было ваше намерение?

Вторая ошибка, вероятно, вызвана первой.

0

По вопросам рекламы [email protected]