Форвардные объявления: шаблоны и наследование - PullRequest
4 голосов
/ 07 мая 2011

При написании фреймворка у меня возникла следующая проблема: у меня есть class A и class B, которые получены из class A.

class A имеет функцию, которая возвращает B*.

Конечно, это не сложно:

#include <iostream>
using namespace std;

class B; // forward declaration

class A
{
    public:
        B* ReturnSomeData();
};

class B : public A
{
};

// Implementation:

B* A::ReturnSomeData()
{
    return new B; // doesn't matter how the function makes pointer
}

int main()
{
    A sth;

    cout << sth.ReturnSomeData(); // print adress
}

Однако мне пришлось использовать шаблоны, как здесь:

#include <iostream>
using namespace std;

// This "forward declaration":

template <class Number>
class B<Number>;

// cannot be compiled:
// "7 error: 'B' is not a template"

template <class Number>
class A
{
    public:
        B<Number>* ReturnSomeData();
};

template <class Number>
class B : public A<Number>
{
};

// Implementation:

template <class Number>
B<Number>* A<Number>::ReturnSomeData()
{
    return new B<Number>;
}

int main()
{
    A<int> sth;

    cout << sth.ReturnSomeData();
}

Посмотрите на код.Как видите, я не знаю, как поступить с неизвестным с помощью A B*.Можно ли написать предварительную декларацию?Или мне нужно что-то другое?

Да, я искал и вижу много сообщений о объявлениях шаблонов, но не могу найти решение для моей индивидуальной проблемы.Это немного сложно для меня.

Спасибо за помощь.

1 Ответ

9 голосов
/ 07 мая 2011

Ваша предварительная декларация неверна. Это должно быть:

template <class Number>
class B;
       ^ no argument list
...