Прямые объявления: шаблоны и наследование

#c #templates #inheritance #declaration

#c #шаблоны #наследование #объявление

Вопрос:

При написании фреймворка я столкнулся со следующей проблемой: у меня есть 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
}
  

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

 #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();
}
  

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

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

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

Ответ №1:

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

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

Комментарии:

1. Спасибо 🙂 Это работает в этом простом примере. Но мне все еще интересно, почему это не работает в моей среде. Я напишу, если поищу причину.

2. Хорошо, я знаю, что я сделал неправильно — компилятор начал отображать » B не является шаблонным типом » вместо » B не является шаблонным «. Это была основная проблема. Это было потому, что в одном файле было class B объявление (старый файл, который я забыл переделать для использования шаблонов). Вот почему я не смог объявить: template <class Number> B (компилятор знал «нетемплифицированный» B, поэтому он не разрешил мне новое объявление). И из-за этого я думал, что объявление без списка параметров неверно, но это правильно. Еще раз спасибо :).