Okej, poradziłem sobie z tamtym problemem, teraz tak jakby nie miał dostępu do wierzchołka "Wierzcholek", czemu ?? Jak temu zaradzić.

#include <iostream>
#include <windows.h>

using namespace std;

template <class TD>
class Drzewo {
public:
class Wierzcholek {
public:
Wierzcholek(const TD& d)
: lewy(NULL)
, prawy(NULL)
, dane(d)
{
}
TD dane;
Wierzcholek* lewy, *prawy;
};

public:
Drzewo();
Drzewo(const Drzewo&);
bool Wstaw(const TD&);
void PreOrder() const;
void InOrder() const;
void PostOrder() const;
bool Usun(const TD&);
~Drzewo();
int licznik_liczba_w;

protected:
typedef Wierzcholek* WskWierzcholek;
WskWierzcholek korzen; // root

private:
bool WstawPomocnicza(WskWierzcholek&, const TD&);
void InOrderPom(WskWierzcholek) const;
void PreOrderPom(WskWierzcholek) const;
void PostOrderPom(WskWierzcholek) const;
void UsunDrzewo(WskWierzcholek&);
};

template <class TD>
class DrzewoD : public Drzewo<TD> {
public:
typedef class Drzewo<TD>::Wierzcholek* WskWierzcholek;
WskWierzcholek korzen; // root
public:
int LiczbaWierzcholkow();
};

template <class TD>
int DrzewoD<TD>::LiczbaWierzcholkow()
{
if (korzen == NULL)
return 0;
else
return 1 + LiczbaWierzcholkow(korzen->lewy) + LiczbaWierzcholkow(korzen->prawy);
}

template <class TD>
Drzewo<TD>::Drzewo()
{
korzen = NULL;
}

template <class TD>
bool Drzewo<TD>::Wstaw(const TD& d)
{
return WstawPomocnicza(korzen, d);
}

template <class TD>
bool Drzewo<TD>::WstawPomocnicza(WskWierzcholek& wsk, const TD& d)
{
if (wsk == NULL) {
WskWierzcholek pom;
try {
pom = new Wierzcholek(d);
wsk = pom;
return true;
}
catch (...) {
return false;
}
}
else {
// Drzewo nie jest puste
if (d < wsk->dane)
return WstawPomocnicza(wsk->lewy, d);
else if (wsk->dane < d)
return WstawPomocnicza(wsk->prawy, d);
else
return false;
}

//    licznik_liczba_w++;

}

template <class TD>
void Drzewo<TD>::UsunDrzewo(WskWierzcholek& w)
{
if (w != NULL) {
UsunDrzewo(w->lewy);
UsunDrzewo(w->prawy);
delete w;
w = NULL;
}
}

template <class TD>
Drzewo<TD>::~Drzewo()
{
UsunDrzewo(korzen);
}

template <class TD>
void Drzewo<TD>::PreOrderPom(WskWierzcholek w) const
{
if (w != NULL) {
cout << w->dane << " ";
PreOrderPom(w->lewy);
PreOrderPom(w->prawy);
}
}

template <class TD>
void Drzewo<TD>::PreOrder() const
{
PreOrderPom(korzen);
}

template <class TD>
void Drzewo<TD>::PostOrderPom(WskWierzcholek w) const
{
if (w != NULL) {
PostOrderpom(w->lewy);
PostOrderPom(w->prawy);
cout << w->dana << " ";
}
}

template <class TD>
void Drzewo<TD>::PostOrder() const
{
PostOrderPom(korzen);
}

template <class TD>
void Drzewo<TD>::InOrderPom(WskWierzcholek w) const
{
if (w != NULL) {
InOrderpom(w->lewy);
cout << w->dana << " ";
InOrderPom(w->prawy);
}
}

template <class TD>
void Drzewo<TD>::InOrder() const
{
InOrderPom(korzen);
}

template <class TD>
bool Drzewo<TD>::Usun(const TD& d)
{
WskWierzcholek usuwany, zamienny, rodzic;
usuwany = korzen;
rodzic = NULL;

while (usuwany != NULL && usuwany->dane != d) {
    rodzic = usuwany;
    if (d < rodzic->dane)
        usuwany = rodzic->lewy;
    else
        usuwany = rodzic->prawy;
}

if (usuwany == NULL)
    return false;
// usuwamy
if (usuwany->lewy == NULL && usuwany->prawy == NULL) {
    // usuwamy liscia
    if (rodzic != NULL)
        if (usuwany == rodzic->lewy)
            rodzic->lewy = NULL;
        else
            rodzic->prawy = NULL;
    else
        korzen = NULL;
    delete usuwany;
}

else if (usuwany->lewy == NULL || usuwany->prawy == NULL) {
    if (usuwany->lewy == NULL)
        zamienny = usuwany->prawy;
    else
        zamienny = usuwany->lewy;
    // wszystkie dane z zamiennego przeładowujemy do usuwanego
    *usuwany = *zamienny;
}
else
// są dwa poddrzewa
{
    rodzic = usuwany;
    zamienny = usuwany->lewy;
    while (zamienny->prawy != NULL) {
        rodzic = zamienny;
        zamienny = zamienny->prawy;
    }
    usuwany->dane = zamienny->dane;
    if (rodzic == usuwany)
        rodzic->lewy = zamienny->lewy;
    else
        rodzic->prawy = zamienny->prawy;
}
delete zamienny;

return true;

}

int main()
{
Drzewo<int> drzewo;
drzewo.Wstaw(44);
drzewo.Wstaw(33);
drzewo.Wstaw(77);
drzewo.Wstaw(88);
drzewo.Wstaw(66);
drzewo.Wstaw(40);
drzewo.Wstaw(50);
drzewo.Wstaw(70);
drzewo.Wstaw(20);
drzewo.Wstaw(30);
drzewo.Wstaw(10);
drzewo.Wstaw(100);

DrzewoD<int> drzewko;
drzewko.Wstaw(33);
drzewko.Wstaw(77);
cout << drzewko.LiczbaWierzcholkow();
//  drzewo2.Wstaw(88);
// cout << drzewo2.LiczbaWierzcholkow();

system("pause");
return 0;

}