[c++] raar probleem met templated functies in de constructor

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • liquid_ice
  • Registratie: Februari 2001
  • Laatst online: 08-09 14:43
Ik heb een templated observer class en een templated Subject class.

Op het subject kan je attach en detach aanroepen
code:
1
2
3
4
5
6
7
template <typename T>
class CTheSubject
{
public:
  bool Attach(IObserver<T>* aObserver, T const &d);
  bool Detach(IObserver<T>* aObserver, T const &d);
};

De class die CTheSubject implementeerd is een singleton.

De class die de oberser implementeerd erft van "public IObserver<unsigned int>"
Als ik in de constructor van deze class de attach als volgd aanroep gaat alles goed
code:
1
CSettings::Instance()->Attach(this, 3500);


maar als ik het als volgd doe krijg ik undefined reference meldingen
code:
1
CSettings::Instance()->Attach(this, CSettings::SomeSetting);


Het rare hieraan is dat als ik dan weer dit doe het wel weer werkt:
code:
1
2
  int test = CSettings::SomeSetting;
  CSettings::Instance()->Attach(this, test);


Waardoor kan ik niet gewoon de CSettings::SomeSetting in de functie gebruiken?
en waarom werkt het wel als ik um eerst in een integer stop?

Klus page: http://klusthuis.blogspot.com


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Het zou handig zijn als je de klassedefinitie van CSettings ook weergaf. En welke compiler je gebruikt is evt ook handig om te weten. Maar ik vermoed dat CSettings::SomeSetting een 'static const unsigned int' is die je initialiseert in je classdefinitie, en dat je geen MSVC++ gebruikt, correct?

Het probleem is dat CTheSubject een const uint& verwacht, oftewel een reference naar een const uint. De variabele die jij meegeeft is een const uint, alleen heb je die nergens gedefinieerd. Hij heeft dus geen adres, en derhalve klaagt de compiler dat ie 'm niet kan vinden. Mogelijke oplossingen zijn om 'm alsnog te definieren in de sourcefile van CSettings, of om je parameter een T te maken ipv een const T&.

Overigens is die definitie van de variabele zelf officieel wel verplicht:
9.4.2/4
If a static data member is of const integral or const enumeration type, its declaration in the class definition can specify a constant-initializer which shall be an integral constant expression (5.19). In that case, the member can appear in integral constant expressions. The member shall still be defined in a namespace scope if it is used in the program and the namespace scope definition shall not contain an initializer.

[ Voor 29% gewijzigd door .oisyn op 22-09-2009 10:35 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • liquid_ice
  • Registratie: Februari 2001
  • Laatst online: 08-09 14:43
De CSettings headerfile

code:
1
2
3
4
5
6
7
8
9
class CSettings: public CTheSubject<unsigned int>
{
public:
  static CSettings* Instance( void );
    
  static const unsigned int SomeSetting          = 3500;                  // synchronisation

  bla die bla allemaal functies
};


In de cpp file staat niks over SomeSetting.
Ik gebruik gcc als compiler, dus inderdaad geen MSVC++

.oisyn, het is dus inderdaad de defenitie die mist.

Klus page: http://klusthuis.blogspot.com