виртуальные методы и шаблоны классов - PullRequest
5 голосов
/ 28 марта 2010

Я преодолел проблему, я думаю, очень специфическую.

У меня есть 2 класса: B aseclass и D erived класс (из B aseclass). B является шаблоном класса (или шаблоном класса) и имеет чистый виртуальный метод virtual void work(const T &dummy) = 0; * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * M * M * T * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}}}} мне наплевать, что виртуальные функции и шаблоны не работают сразу.

Есть идеи, как добиться того, чего я хочу?

Я благодарен за любые мысли и идеи, особенно если вы уже решили эту проблему

этот класс исправлен, как есть, я не могу редактировать это, не нарушая существующую кодовую базу

template <typename T>
class B {
public:
...
virtual void work(const T &dummy) = 0;
..
};

взять int * в качестве примера

class D : public B<int*>{
...
virtual void work(const int* &dummy){ /* put work code here */ }
..
};

Редактировать: компилятор сообщает мне, что void B<T>::work(const T&) [with T = int*] является чисто виртуальным в пределах D

Ответы [ 4 ]

9 голосов
/ 28 марта 2010

Вы поместили const не в том месте.Попробуйте

virtual void work(int* const &dummy){ /* put work code here */ }

const int* - это то же самое, что и int const*, то есть он связывает const с целым числом, а не с указателем.

1 голос
/ 28 марта 2010

Попробуйте:

int* const& dummy
0 голосов
/ 28 марта 2010

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

template <typename T>
struct B {
virtual void work(T dummy) = 0;
};

struct D : public B<int*>{
virtual void work( int* dummy){ /* put work code here */ }
};

int main() {
    D d;
    d.work( 0 );
}
0 голосов
/ 28 марта 2010

Какой компилятор?

г ++ 4.4 не жаловался:

template <typename T>
class B {
public:
virtual void work(const T &dummy) = 0;
};
class D : public B<int*>{
virtual void work(const int* &dummy){ /* put work code here */ }
};

int main(){return 0;}

РЕДАКТИРОВАТЬ: Конечно, ошибка появлялась только при создании экземпляра D, исправлена ​​путем перемещения ключевого слова const:

template <typename T>
class B {
public:
virtual void work(const T &dummy) = 0;
};
class D : public B<int*>{
virtual void work(int* const &dummy){ /* put work code here */ }
};

int main(){D d;return 0;}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...