Everything is completed in my program, however when I try to compile it I receiv
ID: 3881523 • Letter: E
Question
Everything is completed in my program, however when I try to compile it I receive the following error:
error C2664: 'void shoeTwoLists(List<char>, List<char>)' : cannot convert argument 1 from 'List<int>' to List<char>'
Please help me find a solution to how I can fix this problem. The code is lsited below (the errors are in test3.cpp):
//ListArray.h
#ifndef LISTARRAY_H
#define LISTARRAY_H
#include <stdexcept>
#include <iostream>
using namespace std;
#pragma warning( disable : 4290 )
template < typename DataType >
class List
{
public:
static const int MAX_LIST_SIZE = 10; // Default maximum list size
// Constructors
List ( int maxNumber = MAX_LIST_SIZE ); // Default constructor
List ( const List& source ); // Copy constructor
// Overloaded assignment operator
List& operator= ( const List& source );
// Destructor
virtual ~List ();
// List manipulation operations
virtual void insert ( const DataType& newDataItem ) // Insert after cursor
throw ( logic_error );
void remove () throw ( logic_error ); // Remove data item
virtual void replace ( const DataType& newDataItem ) // Replace data item
throw ( logic_error );
void clear (); // Clear list
// List status operations
bool isEmpty () const; // List is empty
bool isFull () const; // List is full
// List iteration operations
void gotoBeginning () // Go to beginning
throw ( logic_error );
void gotoEnd () // Go to end
throw ( logic_error );
bool gotoNext () // Go to next data item
throw ( logic_error );
bool gotoPrior () // Go to prior data item
throw ( logic_error );
DataType getCursor () const
throw ( logic_error ); // Return data item
// Output the list structure -- used in testing/debugging
virtual void showStructure () const;
// In-lab operations
void moveToNth ( int n ) // Move data item to pos. n
throw ( logic_error );
bool find ( const DataType& searchDataItem ) // Find data item
throw ( logic_error );
protected:
// Data members
int maxSize,
size, // Actual number of data item in the list
cursor; // Cursor array index
DataType *dataItems; // Array containing the list data item
};
#endif
//config.h
#define LAB3_TEST1 1 // 0 => test with char, 1 => test with int
#define LAB3_TEST2 1 // Prog exercise 2: moveToNth
#define LAB3_TEST3 1 // Prog exercise 3: find
/**
* Ordered list class tests.
*/
#define LAB4_TEST1 0 // merge: programming exercise 2
#define LAB4_TEST2 0 // subset: programming exercise 3
//test3.cpp
#include <iostream>
using namespace std;
// Because of C++ template implementations, must include source for templated class
// That is ugly, but it is required.
#include "ListArray.cpp"
#include "config.h"
void print_help();
void showTwoLists(List<char> list1, List<char> list2); // Displays two lists that are supposedly equivalent.
int main()
{
// hack: put a "try/catch" with list creation code?
// we need to demonstrate use of the try/catch syntax.
#if LAB3_TEST1
List<int> testList(8); // Test list to test with ints
List<int> copyList(testList); // Used to test copy constructor
List<int> assignList; // Used to test assignment operator
int testData; // List data item
#else
List<char> testList(8); // Test list to test with chars
List<char> copyList(testList); // Used to test copy constructor
List<char> assignList; // Used to test assignment operator
char testData; // List data item
#endif
int n; // Position within list
char cmd; // Input command
print_help();
do
{
testList.showStructure(); // Output list
cout << endl << "Command: "; // Read command
cin >> cmd;
if ( cmd == '+' || cmd == '=' || cmd == '?' )
cin >> testData;
else if ( cmd == 'M' || cmd == 'm' )
cin >> n;
switch ( cmd )
{
case 'H' : case 'h':
print_help();
break;
case '+' : // insert
cout << "Insert " << testData << endl;
try
{
testList.insert(testData);
}
catch (logic_error &e)
{
cerr << "EXCEPTION: A logic error occurred in the insert function.";
}
break;
case '-' : // remove
cout << "Remove the data item marked by the cursor"
<< endl;
try
{
testList.remove();
}
catch (logic_error &e)
{
cerr << "EXCEPTION: A logic error occurred in the remove function.";
}
break;
case '=' : // replace
cout << "Replace the data item marked by the cursor "
<< "with " << testData << endl;
try
{
testList.replace(testData);
}
catch (logic_error &e)
{
cerr << "EXCEPTION: A logic error occurred in the replace function.";
}
break;
case '@' : // getCursor
try
{
cout << "Data item marked by the cursor is "
<< testList.getCursor() << endl;
}
catch (logic_error &e)
{
cerr << "EXCEPTION: A logic error occurred in the getCursor function.";
}
break;
case '<' : // gotoBeginning
cout << "Go to the beginning of the list" << endl;
try
{
testList.gotoBeginning();
}
catch (logic_error &e)
{
cerr << "EXCEPTION: A logic error occurred in the gotoBeginning function.";
}
break;
case '>' : // gotoEnd
cout << "Go to the end of the list" << endl;
try
{
testList.gotoEnd();
}
catch (logic_error &e)
{
cerr << "EXCEPTION: A logic error occurred in the gotoEnd function.";
}
break;
case 'N' : case 'n' : // gotoNext
try
{
if ( testList.gotoNext() )
cout << "Go to the next data item" << endl;
else
cout << "Failed -- either at the end of the list "
<< "or the list is empty" << endl;
}
catch (logic_error &e)
{
cerr << "EXCEPTION: A logic error occurred in the gotoNext function.";
}
break;
case 'P' : case 'p' : // gotoPrior
try
{
if ( testList.gotoPrior() )
cout << "Go to the prior data item" << endl;
else
cout << "Failed -- either at the beginning of the "
<< "list or the list is empty" << endl;
}
catch (logic_error &e)
{
cerr << "EXCEPTION: A logic error occurred in the gotoPrior function.";
}
break;
case 'C' : case 'c' : // clear
cout << "Clear the list" << endl;
testList.clear();
break;
case 'E' : case 'e' : // isEmpty
if ( testList.isEmpty() )
cout << "List is empty" << endl;
else
cout << "List is NOT empty" << endl;
break;
case 'F' : case 'f' : // isFull
if ( testList.isFull() )
cout << "List is full" << endl;
else
cout << "List is NOT full" << endl;
break;
case '!' :
showTwoLists(copyList, testList);
break;
case '#' :
assignList.insert('x');
assignList = testList;
showTwoLists(assignList, testList);
break;
#if LAB3_TEST2
case 'M' : case 'm' : // In-lab Exercise 2
cout << "Move the data item marked by the cursor to "
<< "posititon " << n << endl;
try
{
testList.moveToNth(n);
}
catch (logic_error &e)
{
cerr << "EXCEPTION: A logic error occurred in the moveToNth function.";
}
break;
#endif // LAB3_TEST1
#if LAB3_TEST3
case '?' : // In-lab Exercise 3
try
{
if ( testList.find(testData) )
cout << "Found" << endl;
else
cout << "NOT found" << endl;
}
catch (logic_error &e)
{
cerr << "EXCEPTION: A logic error occurred in the find function.";
}
break;
#endif // LAB3_TEST3
case 'Q' : case 'q' : // Quit test program
break;
default : // Invalid command
cout << "Inactive or invalid command" << endl;
}
}
while ( cin && cmd != 'Q' && cmd != 'q' );
if( !cin ) {
cout << "Input error" << endl;
}
return 0;
}
void showTwoLists(List<char> list1, List<char> list2) {
// Variables should match, but dynamic memory buffer must be different
cout << "Look at the two lists below and decide whether they are equivalent" << endl;
cout << "List 1: ";
list1.showStructure();
cout << "List 2: ";
list2.showStructure();
cout << endl;
}
void print_help()
{
cout << endl << "Commands:" << endl;
cout << " H : Help (displays this message)" << endl;
cout << " +x : Insert x after the cursor" << endl;
cout << " - : Remove the data item marked by the cursor" << endl;
cout << " =x : Replace the data item marked by the cursor with x"
<< endl;
cout << " @ : Display the data item marked by the cursor" << endl;
cout << " < : Go to the beginning of the list" << endl;
cout << " > : Go to the end of the list" << endl;
cout << " N : Go to the next data item" << endl;
cout << " P : Go to the prior data item" << endl;
cout << " C : Clear the list" << endl;
cout << " E : Empty list?" << endl;
cout << " F : Full list?" << endl;
cout << " ! : Test copy constructor" << endl;
cout << " # : Test assignment operator" << endl;
cout << " M n : Move data item marked by cursor to pos. n ("
#if LAB3_TEST2
<< "Active "
#else
<< "Inactive "
#endif // LAB3_TEST2
<< ": In-lab Ex. 2)" << endl;
cout << " ?x : Search rest of list for x ("
#if LAB3_TEST3
<< "Active "
#else
<< "Inactive "
#endif // LAB3_TEST3
<< ": In-lab Ex. 3)" << endl;
cout << " Q : Quit the test program" << endl;
cout << endl;
}
//show3.cpp
#include "ListArray.h"
template <typename DataType>
void List<DataType>:: showStructure () const
// outputs the data items in a list. if the list is empty, outputs
// "empty list". this operation is intended for testing/debugging
// purposes only.
{
int j; // loop counter
if ( size == 0 )
cout << "empty list" << endl;
// The Ordered List code blows up below. Since this is just debugging
// code, we check for whether the OrderedList is defined, and if so,
// print out the key value. If not, we try printing out the entire item.
// Note: This assumes that you have used the double-inclusion protection
// in your OrderedList.cpp file by doing a "#ifndef ORDEREDLIST_CPP", etc.
// If not, you will need to comment out the code in the section under
// the "else", otherwise the compiler will go crazy in lab 4.
// The alternative is to overload operator<< for all data types used in
// the ordered list.
else
{
cout << "size = " << size
<< " cursor = " << cursor << endl;
for ( j = 0 ; j < maxSize ; j++ )
cout << j << " ";
cout << endl;
for ( j = 0 ; j < size ; j++ ) {
if( j == cursor ) {
cout << "[";
cout << dataItems[j]
#ifdef ORDEREDLIST_CPP
.getKey()
#endif
;
cout << "]";
cout << " ";
}
else
cout << dataItems[j]
#ifdef ORDEREDLIST_CPP
.getKey()
#endif
<< " ";
}
cout << endl;
}
}
//ListArray.cpp
#include "ListArray.h"
template < typename DataType >
List<DataType>::List(int maxNumber)
{
maxSize = maxNumber;
size = 0;
cursor = -1;
dataItems = new DataType[maxSize];
}
template < typename DataType >
List<DataType>::List(const List& source)
{
maxSize = source.maxSize;
size = source.size;
cursor = source.cursor;
dataItems = new DataType[maxSize];
for (int i = 0; i<size; i++)
{
dataItems[i] = source.dataItems[i];
}
}
template < typename DataType >
List<DataType>& List<DataType>::operator= (const List& source)
{
delete[] dataItems;
size = source.size;
maxSize = source.maxSize;
cursor = source.cursor;
dataItems = new DataType[maxSize];
for (int i = 0; i<size; i++)
{
dataItems[i] = source.dataItems[i];
}
return *this;
}
template < typename DataType >
List<DataType>::~List()
{
delete[] dataItems;
}
template < typename DataType >
void List<DataType>::insert(const DataType& newDataItem)
throw (logic_error)
{
if (size == maxSize)
throw logic_error("List is full");
else
{
for (int i = size - 1; i>cursor; i--){
DataType initialI = dataItems[i];
dataItems[i] = dataItems[i + 1];
dataItems[i + 1] = initialI;
}
dataItems[cursor + 1] = newDataItem;
size++;
cursor++;
}
}
template < typename DataType >
void List<DataType>::remove() throw (logic_error)
{
if (size == 0){
throw logic_error("the list is empty");
}
else{
if (cursor == size - 1)
{
size--;
gotoBeginning();
}
else
{
for (int i = cursor; i<size; i++)
{
dataItems[i] = dataItems[i + 1];
}
size--;
}
}
}
template < typename DataType >
void List<DataType>::replace(const DataType& newDataItem)
throw (logic_error)
{
if (size == 0)
{
throw logic_error("The List is full");
}
else
{
dataItems[cursor] = newDataItem;
}
}
template < typename DataType >
void List<DataType>::clear()
{
size = 0;
cursor = 0;
}
template < typename DataType >
bool List<DataType>::isEmpty() const
{
if (size == 0)
return true;
else
return false;
}
template < typename DataType >
bool List<DataType>::isFull() const
{
if (size != MAX_LIST_SIZE)
return false;
else
return true;
}
template < typename DataType >
void List<DataType>::gotoBeginning()
throw (logic_error)
{
if (size == 0)
{
throw logic_error("The List is empty");
}
else
{
cursor = 0;
}
}
template < typename DataType >
void List<DataType>::gotoEnd()
throw (logic_error)
{
if (size == 0)
{
throw logic_error("The List is empty");
}
else
{
cursor = size - 1;
}
}
template < typename DataType >
bool List<DataType>::gotoNext()
throw (logic_error)
{
if (size == 0)
{
throw logic_error("The List is empty");
}
else
{
if (cursor<size - 1)
{
cursor++;
return true;
}
}
return false;
}
template < typename DataType >
bool List<DataType>::gotoPrior()
throw (logic_error)
{
if (isEmpty())
{
throw logic_error("The List is empty");
}
else
{
if (cursor != 0)
{
cursor--;
return true;
}
}
return false;
}
template < typename DataType >
DataType List<DataType>::getCursor() const
throw (logic_error)
{
DataType t = dataItems[cursor];
if (isEmpty())
throw logic_error("List is empty, nothing to retrieve");
else
return t;
}
#include "show3.cpp"
template < typename DataType >
void List<DataType>::moveToNth(int n)
throw (logic_error)
{
}
template < typename DataType >
bool List<DataType>::find(const DataType& searchDataItem)
throw (logic_error)
{
return false;
}
Explanation / Answer
#if LAB3_TEST1
List<int> testList(8); // Test list to test with ints
List<int> copyList(testList); // Used to test copy constructor
List<int> assignList; // Used to test assignment operator
int testData; // List data item
#else
List<char> testList(8); // Test list to test with chars
List<char> copyList(testList); // Used to test copy constructor
List<char> assignList; // Used to test assignment operator
char testData; // List data item
#endif
If you look into this block you will find that the type of testList and copyList is either List<int> or List<char> based on LAB3_TEST1
but latter you try calling
showTwoLists(copyList, testList);
but it is expecting params (List<char>, List<char>) irespetble of LAB3_TEST1
and thus the error is quite justified
What you can do is:
1.
REPLACE
void showTwoLists(List<char> list1, List<char> list2); // Displays two lists that are supposedly equivalent.
WITH
// Displays two lists that are supposedly equivalent.
#if LAB3_TEST1
void showTwoLists(List<int> list1, List<int> list2);
#else
void showTwoLists(List<char> list1, List<char> list2);
#endif
2.
REPLACE
void showTwoLists(List<char> list1, List<char> list2) {
// Variables should match, but dynamic memory buffer must be different
cout << "Look at the two lists below and decide whether they are equivalent" << endl;
cout << "List 1: ";
list1.showStructure();
cout << "List 2: ";
list2.showStructure();
cout << endl;
}
WITH
#if LAB3_TEST1
void showTwoLists(List<int> list1, List<int> list2) {
// Variables should match, but dynamic memory buffer must be different
cout << "Look at the two lists below and decide whether they are equivalent" << endl;
cout << "List 1: ";
list1.showStructure();
cout << "List 2: ";
list2.showStructure();
cout << endl;
}
#else
void showTwoLists(List<char> list1, List<char> list2) {
// Variables should match, but dynamic memory buffer must be different
cout << "Look at the two lists below and decide whether they are equivalent" << endl;
cout << "List 1: ";
list1.showStructure();
cout << "List 2: ";
list2.showStructure();
cout << endl;
}
#endif
What else you can do is:
try generic List
REPLACE
void showTwoLists(List<char> list1, List<char> list2); // Displays two lists that are supposedly equivalent.
WITH
void showTwoLists(List list1, List list2); // Displays two lists that are supposedly equivalent.
and REPLACE
void showTwoLists(List<char> list1, List<char> list2) {
// Variables should match, but dynamic memory buffer must be different
cout << "Look at the two lists below and decide whether they are equivalent" << endl;
cout << "List 1: ";
list1.showStructure();
cout << "List 2: ";
list2.showStructure();
cout << endl;
}
WITH
void showTwoLists(List list1, List list2) {
// Variables should match, but dynamic memory buffer must be different
cout << "Look at the two lists below and decide whether they are equivalent" << endl;
cout << "List 1: ";
list1.showStructure();
cout << "List 2: ";
list2.showStructure();
cout << endl;
}
*Note that not all compilers support this and is not safe to use
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.