Compiler sends wrong syntax error

I have a "kolekcija" class with 2 template classes which work finely when testing in main with the Kolekcija<int, int> but when used in pair with "Osoba" class like Kolekcija<Osoba, int> it throws a bunch of syntax errors like "T1" is not a member of Kolekcija<Osoba, int> and
also an error like 'obj': is not a member of 'Kolekcija<Osoba,int>'

This is compiled in Visual studio 2015 as win32 console application

What is funny is that ALL the syntax errors go away if I comment the ccopy constructor and assignment operator inside class "Imenik", but then after printing out Kolekcija<int, int> there
is a runtime error because of the pointer inside Imenik, which causes
the destructor to be initialized on an already destroyed object


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
  #include <iostream>
#include <string>
using namespace std;

int redniBr = 100;
template <class T1, class T2>
class Kolekcija {
	T1* niz1;
	T2* niz2;
	int* _trenutno;
public:
	Kolekcija(){
		niz1 = nullptr;
		niz2 = nullptr;
		_trenutno = new int(0);
	}
	~Kolekcija() {
		delete[] niz1;
		delete[] niz2;
		niz1 = nullptr;
		niz2 = nullptr;
	}
	Kolekcija(const Kolekcija& obj) {
		_trenutno = new int(obj.(*_trenutno));
		niz1 = new T1[_trenutno];
		niz2 = new T2[_trenutno];
		for (int i = 0; i < _trenutno; i++) {
			niz1[i] = obj.niz1[i];
			niz2[i] = obj.niz2[i];
		}
	}
	Kolekcija operator=(const Kolekcija& obj) {
		if (this != &obj) {
			delete[] niz1;
			delete[] niz2;
			int newSize = obj.(*_trenutno);
			niz1 = new T1[newSize];
			niz2 = new T2[newSize];
			for (int i = 0; i < obj.(*_trenutno); i++) {
				niz1[i] = obj.niz1[i];
				niz2[i] = obj.niz2[i];
			}
		}
		return *this;
	}
	void addElement(T1 e1, T2 e2) {
		int newSize = (*_trenutno) + 1;
		T1* temp1 = new T1[newSize];
		T2* temp2 = new T2[newSize];
		for (int i = 0; i < (*_trenutno); i++) {
			temp1[i] = niz1[i];
			temp2[i] = niz2[i];
		}
		temp1[(*_trenutno)] = e1;
		temp2[(*_trenutno)] = e2;
		delete[] niz1;
		delete[] niz2;
		niz1 = temp1;
		niz2 = temp2;
		(*_trenutno)++;
	}
	int getTrenutno() {
		return (*_trenutno);
	}
	T1 getElement1(int lokacija) {
		return niz1[lokacija];
	}
	T2 getElement2(int lokacija) {
		return niz2[lokacija];
	}
	friend ostream& operator<< <>(ostream&, Kolekcija<T1, T2>&);
};

template<class T1, class T2>
ostream& operator << <>(ostream& COUT, Kolekcija<T1, T2>& obj) {
	for (int i = 0; i < obj.getTrenutno(); i++) {
		COUT << obj.niz1[i] << "-" << obj.niz2[i] << endl;
	}
	return COUT;
}

ostream& operator << (ostream& COUT, Krug& obj) {
	COUT << "[" << obj.getX() << ", " << obj.getY() << "]" << endl;
	return COUT;
}

ostream& operator<<(ostream& COUT, Tacka& obj) {
	COUT << "[" << obj.getX() << ", " << obj.getY() << "]" << endl;
	return COUT;
}

class Osoba {
	string imePrezime;
	string JMBG;
public:
	Osoba(string ip="---", string jmb="---") {
		imePrezime = ip;
		JMBG = jmb;
	}
	bool operator==(Osoba& drugi) {
		if (JMBG == drugi.JMBG) return true;
		return false;
	}
};

class Imenik {
	Kolekcija<Osoba, int>* imenikKolekcija;
	string _imenikID;
	int _trenutno;
public:
	Imenik(string ID) {
		_imenikID = ID;
		imenikKolekcija = new Kolekcija<Osoba, int>;
	}
	~Imenik() {
		cout << "pozivam destruktor" << endl;
		delete imenikKolekcija;
		imenikKolekcija = nullptr;
	}
/*	Imenik(const Imenik& obj) {
		_trenutno = obj._trenutno;
		Kolekcija<Osoba, int> temp;
		temp = *obj.imenikKolekcija;
		imenikKolekcija = new Kolekcija<Osoba, int>(temp);
		_imenikID = obj._imenikID;
	}*/
	Imenik& operator=(const Imenik& obj) {
		if (this != &obj) {
			delete imenikKolekcija;
			_trenutno = obj._trenutno;
			imenikKolekcija = new Kolekcija<Osoba, int>(*(obj.imenikKolekcija));
			_imenikID = obj._imenikID;
		}
		return *this;
	}
	Imenik operator+=(Osoba& o) {
		for (int i = 0; i < _trenutno; i++) {
			if (imenikKolekcija->getElement1(i) == o) {
				cout << "Osoba vec postoji" << endl;
				break;
			}
		}
		imenikKolekcija->addElement(o, redniBr);
		redniBr++;
		return *this;
	}
};

void main() {
	Kolekcija<int, int> k1;
	for (int i = 1; i <= 20; i++) { 
		k1.addElement(i, i * 2);
	}
	cout << k1;
	Osoba o1("Emir", "Nemir");
	Osoba o2("Mujo", "Mujic");
	Imenik imenik1("FDB55");
	imenik1 += o1;
	//imenik1 += o1;
	//imenik1 += o2;
	system("pause");
}
Last edited on
I've improved what I could.
If this is not an exercise or an assignment, I think you should really rely on the standard library.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
#include <iostream>
#include <limits>
#include <stdexcept>
#include <string>

int redniBr = 100;  // Non constant global variable...
                    // More or less like shooting on one's foot.

template <typename T1, typename T2>
class Kolekcija {
    T1* niz1        { nullptr };
    T2* niz2        { nullptr };
    int trenutno    {};
public:
    Kolekcija() = default;
    ~Kolekcija()
    {
        delete[] niz1;
        niz1 = nullptr;
        delete[] niz2;
        niz2 = nullptr;
    }
    Kolekcija(const Kolekcija& obj)
    {
        trenutno = obj.trenutno;
        niz1 = new T1[trenutno];
        niz2 = new T2[trenutno];
        for (int i = 0; i < trenutno; i++) {
            niz1[i] = obj.niz1[i];
            niz2[i] = obj.niz2[i];
        }
    }
    Kolekcija& operator=(const Kolekcija& obj)
    {
        if (this != &obj) {
            delete[] niz1;
            delete[] niz2;
            trenutno = obj.trenutno;
            niz1 = new T1[trenutno];
            niz2 = new T2[trenutno];
            for (int i = 0; i < trenutno; i++) {
                niz1[i] = obj.niz1[i];
                niz2[i] = obj.niz2[i];
            }
        }
        return *this;
    }
    void addElement(const T1 e1, const T2 e2)
    {
        int new_size = trenutno + 1;
        T1* temp1 = new T1[new_size];
        T2* temp2 = new T2[new_size];
        for (int i = 0; i < trenutno; i++) {
            temp1[i] = niz1[i];
            temp2[i] = niz2[i];
        }
        temp1[trenutno] = e1;
        delete[] niz1;
        niz1 = temp1;
        temp2[trenutno] = e2;
        delete[] niz2;
        niz2 = temp2;
        trenutno++;
    }
    int getTrenutno() const
    {
        return trenutno;
    }
    T1 getElement1(int lokacija) const
    {
        if(lokacija < trenutno) { return niz1[lokacija]; }
        else {
            throw std::out_of_range("Invalid position required\n");
        }
    }
    T2 getElement2(int lokacija) const
    {
        if(lokacija < trenutno) { return niz2[lokacija]; }
        else {
            throw std::out_of_range("Invalid position required\n");
        }
    }
    template<class T3, class T4>
    friend std::ostream& operator<<(std::ostream& os, const Kolekcija<T3, T4>& obj);
};

template<class T3, class T4>
std::ostream& operator<<(std::ostream& os, const Kolekcija<T3, T4>& obj)
{
    for (int i = 0; i < obj.getTrenutno(); i++) {
        os << obj.niz1[i] << '-' << obj.niz2[i] << '\n';
    }
    return os;
}

// std::ostream& operator<<(std::ostream& os, const Krug& obj)
// {
    // return os << "[" << obj.getX() << ", " << obj.getY() << "]\n";
// }

// std::ostream& operator<<(std::ostream& os, const Tacka& obj)
// {
    // return os << "[" << obj.getX() << ", " << obj.getY() << "]\n";
// }

class Osoba {
    std::string ime_prezime;
    std::string jmbg;
public:
    Osoba(std::string ip = "---", std::string jmb = "---")
        : ime_prezime {ip}, jmbg {jmb}
            {}
    bool operator==(const Osoba& drugi)
    {
        return jmbg == drugi.jmbg;
    }
};

class Imenik {
    Kolekcija<Osoba, int>* imenikKolekcija;
    std::string imenikID;
    int trenutno;
public:
    Imenik(std::string ID) : imenikKolekcija {new Kolekcija<Osoba, int>},
                             imenikID {ID},
                             trenutno {}
        {}
    ~Imenik()
    {
        std::cout << "pozivam destruktor\n";
        delete imenikKolekcija;
        imenikKolekcija = nullptr;
    }
    /*	Imenik(const Imenik& obj) {
        _trenutno = obj._trenutno;
        Kolekcija<Osoba, int> temp;
        temp = *obj.imenikKolekcija;
        imenikKolekcija = new Kolekcija<Osoba, int>(temp);
        _imenikID = obj._imenikID;
    }*/
    Imenik& operator=(const Imenik& obj)
    {
        if (this != &obj) {
            delete imenikKolekcija;
            trenutno = obj.trenutno;
            imenikKolekcija = new Kolekcija<Osoba, int>[trenutno];
            for(int i{}; i<trenutno; ++i) {
                imenikKolekcija[i] = obj.imenikKolekcija[i];
            }
            imenikID = obj.imenikID;
        }
        return *this;
    }
    Imenik& operator+=(const Osoba& osaba)
    {
        for (int i = 0; i < trenutno; i++) {
            if (imenikKolekcija->getElement1(i) == osaba) {
                std::cout << "Osoba vec postoji\n";
                return *this;
            }
        }
        imenikKolekcija->addElement(osaba, redniBr);
        redniBr++;
        trenutno++;
        return *this;
    }
};

void waitForEnter();

int main()
{
    Kolekcija<int, int> k1;
    try {
        for (int i = 1; i <= 20; i++) { 
            k1.addElement(i, i * 2);
        }
        std::cout << k1;
        Osoba o1("Emir", "Nemir");
        Osoba o2("Mujo", "Mujic");
        Imenik imenik1("FDB55");
        imenik1 += o1;
        //imenik1 += o1;
        //imenik1 += o2;
    } catch (std::out_of_range& e) {
        std::cout << "Exception thrown: " << e.what() 
                  << "\nExiting now.\n";
    }
    waitForEnter();
    return 0;
}

void waitForEnter()
{
    std::cout << "\nPress ENTER to continue...\n";
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}

Last edited on
Topic archived. No new replies allowed.