Я преобладал над проблемой, я думаю очень определенный.
У меня есть 2 класса, B aseclass и D erived класс (от B aseclass). B является шаблонным классом (или шаблон класса) и имеет чистый виртуальный метод virtual void work(const T &dummy) = 0;
D erived класс, как предполагается, повторно реализует это, но поскольку D Получен из B, а не D, являющегося другим шаблонным классом, слюной компилятора во мне, что виртуальные функции и шаблоны не работают сразу.
Какие-либо идеи, как выполнить то, что я хочу?
Я благодарен за любые мысли и Идеи, особенно если Вы уже решили ту проблему
этот класс фиксируется иначе, AS, я не могу отредактировать это, не повреждая существующую кодовую базу
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 */ }
..
};
Править: Компилятор говорит мне, этому void B<T>::work(const T&)
[with T = int*]
чист виртуальный в D
Вы разместили константу не в том месте. Попробуйте
virtual void work(int* const &dummy){ /* put work code here */ }
const int *
то же самое, что и int const *
, то есть связывает const с int, а не с указателем.
Какой компилятор?
g ++ 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;}
У вас есть проблема с константой и ссылкой. Следующие компилируются:
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 );
}