I've been all over google trying to understand why I can't get this to work

I've tried all kinds of things I've seen out there, even including the source file (ugh!) but whenever I'm not getting compiler errors, I'm getting linker errors.

OK, maybe I'm just a rube.

Anyway the code below is throwing this compiler exception.

LNK2019 unresolved external symbol public: virtual __thiscall ControlGroup<class QRadioButton> .. yada ... yada ... yada

Here is the code that declares an instance of the template in a header file.

bits.h
Qt Code:
  1. #include "controlgroup.h"
  2.  
  3. class Ui_bits
  4. {
  5. public:
  6. ControlGroup<QRadioButton> *pBitSize;
  7.  
  8. }
To copy to clipboard, switch view to plain text mode 

Here's the call that invokes the template and incurs the wrath of the linker.

bits.cpp
Qt Code:
  1. #include "bits.h"
  2.  
  3. void some_init_func()
  4. {
  5. Twidget tw;
  6. ui->pBitSizes = new ControlGroup <QRadioButton>(&tw, ui->centralWidget);
  7. }
To copy to clipboard, switch view to plain text mode 

Here is the header for the offending template class...

controlgroup.h
Qt Code:
  1. #ifndef CONTROLGROUP_H
  2. #define CONTROLGROUP_H
  3.  
  4. #include <QtCore>
  5. #include <QtGui>
  6.  
  7. typedef void (*pf)(int);
  8.  
  9. class Twidget
  10. {
  11. public:
  12. QString name;
  13. QSignalMapper mapper;
  14. QList <pf> slotList;
  15. int count;
  16. };
  17.  
  18. template <typename T>
  19. class ControlGroup : public QWidget
  20. {
  21. public:
  22. explicit ControlGroup(Twidget *tw, QWidget *parent=0)
  23. {
  24. init (tw, parent );
  25. }
  26. ControlGroup(){};
  27.  
  28. void init( Twidget *tw, QWidget *parent);
  29. ~ControlGroup();
  30. QList<T> widget;
  31.  
  32. private:
  33. Twidget *m_tw;
  34. QWidget *m_parent;
  35.  
  36. #include "controlgroup.cpp"
  37. };
  38.  
  39. #endif // CONTROLGROUP_H
To copy to clipboard, switch view to plain text mode 

... and here's the source ...

controlgroup.cpp
Qt Code:
  1. #ifndef CONTROLGROUP_CPP
  2. #define CONTROLGROUP_CPP
  3.  
  4. #include "controlgroup.h"
  5.  
  6. template <typename T>
  7. void init( Twidget *tw, QWidget *parent )
  8. {
  9. for (int index = 0; index < tw->count; index++)
  10. {
  11. widget.append(new <T>(parent));
  12. }
  13. }
  14.  
  15. #endif
To copy to clipboard, switch view to plain text mode 

I'm sure it's something stupid, and that you guys frequently see ignorance like this.

It's probably a face-palmer, but I just can't figure it out.