identifier not found при создании шаблонных классов

Прохожу тему шаблонных классов и динамическую идентификацию типов. При замене в классах типа double на шаблон у меня появляется ошибка identifier not found. В чем ошибка?

template <class T>
class figure
{
protected:
    T x, y;
public:
    figure(T i, T j) : x(i), y(j) {};
    virtual T area() = 0;
};

template <class T>
class triangle : public figure<T>
{
public:
    triangle(T i, T j) : figure<T>(i, j) {};
    T area()
    {
        return x * 0.5 * y; // 'x', 'y' identifier not found
    }
};

template <class T>
class rectangle : public figure<T>
{
public:
    rectangle(T i, T j) : figure<T>(i, j) {};
    T area()
    {
        return x * y; 'x', 'y' identifier not found
    }
};

template <class T>
class circle : public figure<T>
{
public:
    circle(T i, T j = 0) : figure<T>(i, j) {};
    T area()
    {
        return 3.14 * x * x; 'x' identifier not found
    }
};

template <class T>
figure<T>* factory()
{
    switch (rand() % 3)
    {
    case 0: return new circle<double>(10.0);
    case 1: return new triangle<double>(10.1, 5.3);
    case 2: return new rectangle<double>(4.3, 5.7);
    }
    return 0;
}


int main()
{
    figure<double>* p;
    int i;

    int t = 0, r = 0, c = 0;

    for (i = 0; i < 10; i++)
    {
        p = factory<double>();
        cout << "Obj has type " << typeid(*p).name() << ". ";

        if (typeid(*p) == typeid(triangle<double>)) t++;
        else if (typeid(*p) == typeid(circle<double>)) c++;
        else r++;
        
        cout << "area is: " << p->area() << "\n";
    }

    cout << "factory made such items \n";
    cout << "Triangles: " << t << "\n";
    cout << "Rectangles: " << r << "\n";
    cout << "Circles: " << c << "\n";

    return 0;
} 

Ответы (1 шт):

Автор решения: Harry

Специфика поиска имен в шаблонах... Следует указывать полностью квалифицированные имена:

    return figure<T>::x * 0.5 * figure<T>::y; // 'x', 'y' identifier is found
→ Ссылка