2010-03-27 4 views
5

У меня проблема, я думаю очень конкретная.виртуальные методы и классы шаблонов

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

Любые идеи, как выполнить то, что я хочу?

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

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

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 */ } 
.. 
}; 

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

+0

Читать здесь, почему она до сих пор не работает для меня (как пытался это с классами Qt), Qt дизайн недостаток ... http://lists.trolltech.com/qt-interest/2006 -02/thread00693-0.html – drahnr

+0

и см. Здесь http://doc.trolltech.com/qq/qq15-academic.html , в конце концов, я должен использовать старые злые void * вместо шаблонов ... – drahnr

ответ

9

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

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

const int* таким же, как int const*, т.е. она связывает Конст с междунар и не указатель.

1

Try:

int* const& dummy 
+0

Делает это действительно имеет значение, я имею в виду, что я сделал это, как выше, так как я изучил C++, и никто до сих пор не жаловался ... до сих пор ... Есть ли какая-то документация и передовая практика для const? – drahnr

+4

Это разница между «const-указателем на int» и «указателем на const int». –

+0

Дополнение: 'const' является связующим влево, если только влево ничего нет, тогда он связывается с правой (это наиболее распространенное использование) – drahnr

0

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

г ++ 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;} 

EDIT: Конечно - ошибка только появилась, когда на самом деле инстанцирование D, фиксируется путем перемещения константного ключевого слова:

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;} 
+2

@Douglas Поскольку вы не использовали шаблоны. – 2010-03-27 21:59:23

0

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

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); 
} 
Смежные вопросы