0

I am writing a program to implement queue using vectors. I am using the class as template. And in main function am trying to create both string vector and int vector based on template data type. However am getting compilation error from vector assign method.

template <class T> class queueWithArray { private: vector<T> queueArray; int numberOfElements; int size; int head; int tail; public: queueWithArray(int n) { numberOfElements = 0; head = -1; tail = -1; size = n; if(is_same<T,string>::value) { cout << "data type is string" << endl; queueArray.assign(n,""); } else { queueArray.assign(n,0); } } ... int main() { string InputArray[] = {"to", "be", "or", "not", "to", "-", "be", "-", "-", "that", "-", "-", "-", "is"}; queueWithArray<string> obj(2); for(auto i=0; i < (signed int)(sizeof(InputArray)/sizeof(InputArray[0])); ++i) { if(InputArray[i] == "-") { string item = obj.dequeue(); cout << "dequeue->" << item << endl; } else { obj.enqueue(InputArray[i]); cout << "enqueue->" << InputArray[i] << endl; } obj.printQueue(); } int InputArray_int[] = {10,20,30,40,50,-1,20,-1,-1,60,-1,-1,-1,70}; queueWithArray<int> obj_int(2); for(auto i=0; i < (signed int)(sizeof(InputArray_int)/sizeof(InputArray_int[0])); ++i) { if(InputArray_int[i] == -1) { int item = obj_int.dequeue(); cout << "dequeue->" << item << endl; } else { obj_int.enqueue(InputArray_int[i]); cout << "enquque->" << InputArray_int[i] << endl; } obj.printQueue(); } return 0; } 

..\QueueUsingTemplate.cpp:135:31: required from here ..\QueueUsingTemplate.cpp:45:4: error: no matching function for call to >'std::vector::assign(int&, const char [1])' queueArray.assign(n,""); ^~~~~~~~~~ In file included from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\vector:64:0, from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\queue:61, from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\mingw32\bits\stdc++.h:86, from ..\QueueUsingTemplate.cpp:18: c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\stl_vector.h:489:7: note: candidate: void >std::vector<_Tp, _Alloc>::assign(std::vector<_Tp, _Alloc>::size_type, const value_type&) [with >_Tp = int; _Alloc = std::allocator; std::vector<_Tp, _Alloc>::size_type = unsigned int; >std::vector<_Tp, _Alloc>::value_type = int] assign(size_type __n, const value_type& __val) ^~~~~~

4
  • 1
    This not enough enough as an minimal reproducible example since includes are not specified. Commented Nov 29, 2021 at 2:35
  • 2
    You need if constexpr ( std::is_same ... ) Commented Nov 29, 2021 at 2:39
  • 2
    Does this answer your question? Difference between "if constexpr()" Vs "if()" Commented Nov 29, 2021 at 2:41
  • 1
    you can just queueArray.assign(n, T{}); Commented Nov 29, 2021 at 5:03

1 Answer 1

0

Thank you so much VainMan. queryArray.assign(n, T{}); solves the issue. Hi Louis, please find the complete program with include statements here.

/* * queueUsingArray.cpp * * Created on: 02-Nov-2021 * Author: Admin */ #include <iostream> #include <ctype.h> #include <bits/stdc++.h> #include <vector> #include <typeinfo> #include <type_traits> using namespace std; template <class T> class queueWithArray { private: vector<T> queueArray; int numberOfElements; int size; int head; int tail; public: queueWithArray(int n) { numberOfElements = 0; head = -1; tail = -1; size = n; queueArray.assign(n,T{}); } void enqueue(T item) { if(numberOfElements == size) { resize(size * 2); } if((head == -1) && (tail == -1)) { head = tail = 0; } else { tail = (tail + 1) % size; } queueArray[tail] = item; numberOfElements++; } T dequeue() { T item; if(numberOfElements == 0) { cout << "No elements to dequeue" << endl; } else { if(numberOfElements == size/4) { resize(size/2); } item = queueArray[head]; if(head == tail) { head = tail = -1; } else { head = (head + 1) % size; } numberOfElements--; } return item; } bool isEmpty() { return ((head == -1) && (tail == -1)); } void resize(int newSize) { if(newSize > 0) { size = newSize; int newIndex = 0; for(int i=head; i<=tail; ++i){ queueArray[newIndex] = queueArray[i]; newIndex++; } queueArray.resize(newSize); head=0; tail=newIndex-1; } else { return; } } void printQueue() { if(!isEmpty()) { for(auto i=head; i<tail; i++) { cout << queueArray[i] << "->"; } cout << queueArray[tail] << endl; } else { cout << "Queue is Empty" << endl; } } }; int main() { string InputArray[] = {"to", "be", "or", "not", "to", "-", "be", "-", "-", "that", "-", "-", "-", "is"}; queueWithArray<string> obj(2); for(auto i=0; i < (signed int)(sizeof(InputArray)/sizeof(InputArray[0])); ++i) { if(InputArray[i] == "-") { string item = obj.dequeue(); cout << "dequeue->" << item << endl; } else { obj.enqueue(InputArray[i]); cout << "enqueue->" << InputArray[i] << endl; } obj.printQueue(); } int InputArray_int[] = {10,20,30,40,50,-1,20,-1,-1,60,-1,-1,-1,70}; queueWithArray<int> obj_int(2); for(auto i=0; i < (signed int)(sizeof(InputArray_int)/sizeof(InputArray_int[0])); ++i) { if(InputArray_int[i] == -1) { int item = obj_int.dequeue(); cout << "dequeue->" << item << endl; } else { obj_int.enqueue(InputArray_int[i]); cout << "enquque->" << InputArray_int[i] << endl; } obj_int.printQueue(); } return 0; } 
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.