The following program contains, to the best of my knowledge, ten errors.

Can you find them all? Some are easy, some are hard, and there are many things that only appear to be errors that exist to fool the unwary.

Rules:
Any error that occurs more than once is one error. For example, an error in the declaration of a function would be repeated on its definition. This is one error, not two.

Errors exist in isolation. That is, if class Dog has an error in its definition, that does not make further use of class Dog an error.

Errors must be explained, not merely located. Responses of "line 12" or quoted text with red highlights are not accepted. Clearly state what is wrong.

I'm only interested in language errors, not logical errors. If the error prevents compilation or linking, it is an error. If it crashes the program at run time, is it not an error.

No assumptions are to made about anything. The only information you have is the code itself.

I have tried very hard to eliminate typos and unintended errors. If someone locates either of these, I will fix the code to correct the unintended mistake.

There are three files in the program, and here they are:

classes.h
Code:
1	#ifndef CLASSES_H
2	#define CLASSES_H
3
4	export template <typename t>
5	class Doodad : private t
6	{
7	public:
8		Doodad();
9		~Doodad();
10		template<int x> virtual void DoIt();
11
12	private:
13		virtual void MakeItSo() = 0;
14
15		t::Thingy Thingy1;
16	};
17
18	template <typename t, template <typename> typename cont>
19	class Archive
20	{
21	public:
22		Archive();
23		~Archive();
24
25	private:
26		cont<t> Data;
27	};
28
29	class TBase
30	{
31	public:
32		struct Thingy
33		{
34			int x;
35			int y;
36			int z;
37		};
38
39		TBase();
40		~TBase();
41		void operator ->* (void (TBase::*f)());
42		void operator .* (void (TBase::*f)());
43
44	private:
45		Thingy T;
46	};
47
48	class Widget : public Doodad<TBase>
49	{
50	private:
51		void MakeItSo() ??< ??>
52	};
53
54	int operator () (Thingy T, int x, int y, int z)
55	{
56		T.x = x;
57		T.y = y;
58		T.z = z;
59
60		return 0;
61	}
62
63	#endif
64

classes.cpp
Code:
1	#include "classes.h"
2
3	template <typename t>
4	Doodad<t>::Doodad()
5	{
6		Thingy1.x = 1;
7	}
8
9	template <typename t>
10	Doodad<t>::~Doodad()
11	{
12		Thingy1.y = 6;
13	}
14
15	template <typename t>
16	template <int x>
17	void Doodad<t>::DoIt()
18	{
19		int *p = &x;
20
21		Thingy1.x *= *p;
22	}
23
24	template <typename t>
25	void Doodad<t>::MakeItSo()
26	{
27		Thingy1.z = 11;
28	}
29
30	template <typename t, template <typename> typename cont>
31	Archive<t, cont>::Archive()
32	{
33		Data.clear();
34	}
35
36	template <typename t, template <typename> typename cont>
37	Archive<t, cont>::~Archive()
38	{
39		Data.destroy();
40	}
41
42	TBase::TBase()
43	{
44		T.x = 1;
45		T.y = T.x * 100;
46		T.z = T.x * T.y;
47	}
48
49	TBase::~TBase()
50	{
51		T.z = 0;
52	}
53
54	void TBase::operator ->* (void (TBase::*f)())
55	{
56		(this->*f)();
57	}
58
59	void TBase::operator .* (void (TBase::*f)())
60	{
61		((*this).*f)();
62	}
63
main.cpp
Code:
1	#include <iostream>
2	#include "classes.h"
3
4	namespace BAM = std;
5
6	template <double d>
7	double PassThrough()
8	{
9		return d;
10	}
11
12	template <int x, int y = 0>
13	int Math()
14	try
15	{
16		return x - y;
17	}
18	catch (...)
19	{
20		BAM::cout << "Critical subtraction failure!" << BAM::endl;
21	}
22
23	union Combo
24	{
25		TBase TB;
26		short tiny;
27		char moretinier;
28	};
29
30	void main()
31	{
32		Widget *W = new Widget;
33
34		try
35		{
36	TheTop:
37			float lotsOfFloats[20];
38
39			if (W and lotsOfFloats[5] or Math<10, 5>())
40			{
41				8[lotsOfFloats] = 4.5;
42
43				goto TheTop;
44			}
45
46			goto Cleanup;
47		}
48		catch (...)
49		{
50	Cleanup:
51			delete W;
52		}
53	}
54