У меня есть шаблонный шаблон A<T>
, который содержит статический метод foo()
, который возвращает A<T> *
. У меня есть подкласс B
, который просто специализируется на A<int>
.вызов статических методов шаблона суперкласса
Чтобы избежать дублирования кода, я бы хотел, чтобы B воспользовался статическим методом foo()
. Однако, следующее получает ошибку компиляции: error: cannot initialize return object of type 'B *' with an rvalue of type 'A<int> *')
Но B *
точно A<int> *
, нет?
Есть ли способ использовать B для использования метода foo()
?
template <typename T>
class A {
public:
static A *foo() {
// imagine complex code here
return new A<T>();
}
};
// B is a typed specialization of A
class B : public A<int> {
public:
static B *foo() {
return A<int>::foo(); // doesn't compile
}
};
int main() {
B *b = B::foo();
(void)b; // suppress unused variable warning
}
'Я хотел бы B использовать A статический метод foo(), 'A :: foo()' является общедоступным, почему вы дублируете его в 'B'? – billz
Потому что я пропустил подробности, чтобы упростить пример: 'B :: foo()' выполняет некоторые дополнительные функции для объекта, возвращаемого 'A :: foo()'. –
_ «Но B * точно A *, нет?» _ Ну, нет! Не за что. 'B' не является специализацией' A'. 'A ' является специализацией 'B'. 'B' - класс, который наследуется от' A '. Это отличный тип. –