Bardzo proszę o pomoc w wyjaśnieniu czego nie rozumiem z dziedziny szablonów.
Mam do napisania program, który przechowuje bazę danych sieci sklepów z zabawkami. Od kilku dni spędza mi on sen z powiek, bo różne próby przebudowania tego programu kończą się podobną serią błędów, których nie potrafię zlikwidować... Treść plików cpp i hpp bez funkcji main(), komunikat kompilatora oraz link do całego projektu zamieszczam poniżej:
//========================================== // Name : templateIterator.hpp //========================================== #ifndef TEMPLATEITERATOR_HPP #define TEMPLATEITERATOR_HPP #include <cmath> #include <cstdio> #include <iomanip> #include <iostream> #include <vector> #include <windows.h> using namespace std; template <typename T, typename P> class Iterator { private: P* pointer; short item; public: Iterator(P& container) : pointer (&container), item(0) {} T& operator*() { return (*pointer)[item]; } Iterator& operator++() { // później spróbować bez referencji i gwiazdek item++; return *this; } Iterator& operator++(int) { item++; return *this; } Iterator& operator--() { item--; return *this; } Iterator& operator--(int) { item--; return *this; } Iterator& operator+(int add) { item += add; return *this; } Iterator& operator-(int subtract) { item -= subtract; return *this; } Iterator& operator=(const Iterator& another) { pointer = another.pointer; item = another.item; } bool operator==(const Iterator& another) { return (pointer == another.pointer && item == another.item) ? true : false; } bool operator!=(const Iterator& another) { return !(*this == another); } }; #endif
//========================================== // Name : templateContainer.hpp //========================================== #ifndef TEMPLATECONTAINER_HPP #define TEMPLATECONTAINER_HPP #include "templateIterator.hpp" template <typename T> class Container { private: T* table; static const short initial = 5; unsigned short capacity; unsigned short quantity; public: typedef Iterator<T, Container<T> > iterator; Container(int cccc) : capacity(initial), quantity(0), table(new T[capacity]) {} // brakuje jedynie argumentów ~Container() { delete[] table; } Container(const Container& another) { quantity = another.quantity(); capacity = another.capacity(); if (table != 0) delete[] table; table = new T[capacity]; for (unsigned short i = 0 ; i < quantity; i++) table[i] = another.table[i]; } Container& operator=(const Container& another) { quantity = another.quantity; capacity = another.quantity; if (table != NULL) delete[] table; table = new T[capacity]; for (unsigned short i = 0 ; i < quantity; i++) table[i] = another.table[i]; return *this; } T& operator[](int position) const { return table[position]; } void erase(int position) { for (unsigned short i = position ; i < quantity; i++) table[i] = table[i+1]; quantity--; } void insert(const T& element, int position) { quantity++; if (quantity >= capacity) resize(); T* temp = new T[capacity]; for (unsigned short i = 0; i < position; i++) temp[i] = table[i]; temp[position] = element; for (unsigned short i = position + 1; i < capacity; i++) temp[i] = table[i]; delete[] table; table = temp; } void push_back(const T& element) { insert(element, quantity); } void pop_back() { erase(quantity - 1); } void resize() { capacity+=5; T* temp = new T[capacity]; for (unsigned short i = 0; i < quantity; i++) temp[i] = table[i]; delete[] table; table = temp; } void clear() { quantity = 0; } int getQuantity() { return quantity; } iterator begin() { return iterator(*this); } iterator end() { return iterator(*this) + quantity; } }; #endif // Iterator it --> invalid use of template-name iterator without an argument list // int Container::size() --> template <class T> class Container used without template parameters
//========================================== // Name : entrepreneur.hpp //========================================== #ifndef ENTREPRENEUR_HPP #define ENTREPRENEUR_HPP #include "templateContainer.hpp" class Toy { public: string name; double price; int amount; Toy(string name, double price, int amount); ~Toy() {} friend ostream& operator<<(ostream& out, const Toy& toy); friend istream& operator>>(istream& in, Toy& toy); }; class Shop { private: string trademark; string address; vector<Toy> Toys; public: Shop(string trademark, string address); ~Shop() {} void addToys(); void deleteToy(string name); friend ostream& operator<<(ostream& out, const Shop& shop); friend istream& operator>>(istream& in, Shop& shop); }; class Chain { private: string trademark; unsigned short amount; Container<Shop> Shops; public: Chain(string trademark); ~Chain() {} void addShop(); friend ostream& operator<<(ostream& out, const Chain& chain); friend istream& operator>>(ostream& in, Chain& chain); }; double controlPrice(double value); void pressKey(); void clearScreen(); #endif
//========================================== // Name : entrepreneur.cpp //========================================== #include "entrepreneur.hpp" Toy::Toy(string name, double price, int amount) : name(name), price(price), amount(amount) {} ostream& operator<<(ostream& out, const Toy& toy) { out << left << setw(20) << toy.name; out << left << setw(7) << toy.price; out << left << setw(7) << toy.amount; return out; } Shop::Shop(string trademark, string address) : trademark(trademark), address(address) {} void Shop::addToys() { cout << "[ 3] --> Add a toy"<< endl << endl; string name; double price; int amount; cout << "Name: "; cin.ignore(USHRT_MAX,'\n'); getline(cin, name); if (name.size() > 20) do { cout << "Toy's name can have only 20 letters. Try again: "; getline(cin, name); } while (name.size() > 20); cout << "Price: "; cin >> price; if (!cin.good() || price < 0) do { cout << "Incorrect data or sub-zero number. Try again: "; cin.clear(); cin.ignore(USHRT_MAX,'\n'); cin >> price; } while (!cin.good() || price <0); cout << "Amount: "; double test; cin >> test; if (!cin.good() || test < 0 || test != ceil(test)) do { cout << "Incorrect data, sub-zero number or floating-point number. Try again: "; cin.clear(); cin.ignore(USHRT_MAX,'\n'); cin >> test; } while (!cin.good() || test < 0 || test != ceil(test)); amount = int(test); Toys.push_back(Toy(name, price, amount)); pressKey(); } void Shop::deleteToy(string name) { for (unsigned short i = 0; i < Toys.size(); i++) if (Toys[i].name == name) Toys.erase(Toys.begin() + i); } ostream& operator<<(ostream& out, const Shop& shop) { out << left << setw(20) << shop.trademark; out << left << setw(40) << shop.address; return out; } Chain::Chain(string trademark) : trademark(trademark), amount(0) {} void Chain::addShop() { cout << "[ 2] --> Add a shop"<< endl << endl; string trademark; string address; cout << "Chain's name: "; cin.ignore(USHRT_MAX,'\n'); getline(cin, trademark); if (trademark.size() > 20) do { cout << "Shop's name can have only 20 letters. Try again: "; getline(cin, trademark); } while (trademark.size() > 20); cout << "Address: "; getline(cin, address);// if (address.size() > 40) do { cout << "Address of shops can have only 50 letters. Try again: "; getline(cin, address); } while (address.size() > 40); cout << endl << "Press any key to return."<< endl; Shops.push_back(Shop(trademark,address)); amount++; getchar(); system("cls"); } ostream& operator<<(ostream& out, const Chain& chain) { out << left << setw(20) << chain.trademark; return out; } void pressKey() { cout << endl << "Press any key to return."<< endl; getchar(); getchar(); system("cls"); } void clearScreen() { printf("\033[2J"); // Screen printf("\033[0;0f"); // Cursor }
||=== Build: Debug in 01 Tester (compiler: GNU GCC Compiler) ===| E:\01 [C++]\entrepreneur\entrepreneur.cpp||In constructor 'Chain::Chain(std::string)':| E:\01 [C++]\entrepreneur\entrepreneur.cpp|70|error: no matching function for call to 'Container<Shop>::Container()'| E:\01 [C++]\entrepreneur\entrepreneur.cpp|70|note: candidates are:| E:\01 [C++]\entrepreneur\templateContainer.hpp|29|note: Container<T>::Container(const Container<T>&) [with T = Shop]| E:\01 [C++]\entrepreneur\templateContainer.hpp|29|note: candidate expects 1 argument, 0 provided| E:\01 [C++]\entrepreneur\templateContainer.hpp|23|note: Container<T>::Container(int) [with T = Shop]| E:\01 [C++]\entrepreneur\templateContainer.hpp|23|note: candidate expects 1 argument, 0 provided| E:\01 [C++]\entrepreneur\templateContainer.hpp||In instantiation of 'void Container<T>::insert(const T&, int) [with T = Shop]':| E:\01 [C++]\entrepreneur\templateContainer.hpp|75|required from 'void Container<T>::push_back(const T&) [with T = Shop]'| E:\01 [C++]\entrepreneur\entrepreneur.cpp|92|required from here| E:\01 [C++]\entrepreneur\templateContainer.hpp|64|error: no matching function for call to 'Shop::Shop()'| E:\01 [C++]\entrepreneur\templateContainer.hpp|64|note: candidates are:| E:\01 [C++]\entrepreneur\entrepreneur.cpp|19|note: Shop::Shop(std::string, std::string)| E:\01 [C++]\entrepreneur\entrepreneur.cpp|19|note: candidate expects 2 arguments, 0 provided| E:\01 [C++]\entrepreneur\entrepreneur.hpp|24|note: Shop::Shop(const Shop&)| E:\01 [C++]\entrepreneur\entrepreneur.hpp|24|note: candidate expects 1 argument, 0 provided| E:\01 [C++]\entrepreneur\templateContainer.hpp||In instantiation of 'void Container<T>::resize() [with T = Shop]':| E:\01 [C++]\entrepreneur\templateContainer.hpp|63|required from 'void Container<T>::insert(const T&, int) [with T = Shop]'| E:\01 [C++]\entrepreneur\templateContainer.hpp|75|required from 'void Container<T>::push_back(const T&) [with T = Shop]'| E:\01 [C++]\entrepreneur\entrepreneur.cpp|92|required from here| E:\01 [C++]\entrepreneur\templateContainer.hpp|84|error: no matching function for call to 'Shop::Shop()'| E:\01 [C++]\entrepreneur\templateContainer.hpp|84|note: candidates are:| E:\01 [C++]\entrepreneur\entrepreneur.cpp|19|note: Shop::Shop(std::string, std::string)| E:\01 [C++]\entrepreneur\entrepreneur.cpp|19|note: candidate expects 2 arguments, 0 provided| E:\01 [C++]\entrepreneur\entrepreneur.hpp|24|note: Shop::Shop(const Shop&)| E:\01 [C++]\entrepreneur\entrepreneur.hpp|24|note: candidate expects 1 argument, 0 provided| ||=== Build failed: 3 error(s), 7 warning(s) (0 minute(s), 0 second(s)) ===|
Link: https://drive.google.com/drive/folders/0B7P1TugcU99rSFpjb1lZZzBDRDA?usp=sharing