Toon posts:

[C++] template-vraag

Pagina: 1
Acties:

Verwijderd

Topicstarter
Zie ik heb hier in mijn code verscheidene delen van code die enorm hard op elkaar trekken:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
      CKleinPakket kp(*lt_LabelInfo);
      if ( kp.IsGoedLabel() )
      {
        if ( !kp.SchrijfNaarQueue() )
        {
          Fire_Error( _bstr_t( _T("Could not write to queue-file") ) );
        }
      }
      else
      {
        Fire_Error( _bstr_t( _T("Erroneous label!") ) );
      }

[... snip ...]

      CParcelLetter pl(*lt_LabelInfo);
      if ( pl.IsGoedLabel() )
      {
        if ( !pl.SchrijfNaarQueue() )
        {
          Fire_Error( _bstr_t( _T("Could not write to queue-file") ) );
        }
      }
      else
      {
        Fire_Error( _bstr_t( _T("Erroneous label!") ) );
      }


Nu heb ik geprobeerd daar een template-functie van te maken:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  template <typename T>
  bool WriteIt( LabelInformation_t * lt_LabelInfo )
  {
    T np(*lt_LabelInfo);

    if ( np.IsGoedLabel() )
      if ( np.SchrijfNaarQueue() )
        return true;
      else
        Fire_Error( _bstr_t( _T("Could not write to queue-file") ) );
    else
      Fire_Error( _bstr_t( _T("Erroneous label!") ) );

    return false;
  }


Maar tja :) je raadt het al :p da werkt nie ;) Waarom zou ik hier om verduidelijking vragen hé :p

Ik vervang bvb zo'n stuk code door:
code:
1
      WriteIt<CParcelLetter>(*lt_LabelInfo);


Maar dan krijg ik volgende fout:
c:\c++ programs\dpd_dll\label.cpp(159) : error C2275: 'CParcelLetter' : illegal use of this type as an expression
c:\c++ programs\dpd_dll\soortenlabels\parcelletter.h(6) : see declaration of 'CParcelLetter'
Dus voor mij wil dat precies zeggen dat ik een typedef niet mee mag geven als template parameter? MSDN zegt dan iets over typedef dat als een variable gebruikt wordt... Maar hmmm, dat doe ik niet (voor zover ik kan zien). Maar hoe los ik dat op voor die bunch of code daar weg te krijgen in bvb een simpele WriteIt?

Een andere mogelijkheid waaraan ik al gedacht heb is voor macro'ke te gebruiken, maar ja ... Dat werkt ook, maar daar leer ik niets uit :D

[ Voor 4% gewijzigd door curry684 op 06-11-2003 00:55 . Reden: Layout :) ]


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 17:14
Gokje: VC6? Die is berucht buggy met templates, in het bijzonder met functie templates als de template parameter niet in de argumenten lijst voorkomt.

Het beste advies is VC7.0|1, die worden nl. wel gesupport. Mocht je nou heel erg gehecht zijn aan VC6, dan is dit de truc:
C++:
1
2
template <typename T> 
  bool WriteIt( LabelInformation_t * lt_LabelInfo, T* dummy = 0 ) 

T in de argumentenlijst, VC6 happy. Je call werkt nog, maar niet alle code blijft werken. Bijvoorbeeld:
C++:
1
bool (*fun_ptr)(LabelInformation_t * lt_LabelInfo) = &WriteIt<CParcelLetter>;

werkt niet meer.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
Ik gebruik inderdaad VS6.

Nu heb ik die functie-parameterlijst aangepast, maar het werkt nog niet hoor... Dit geeft idem dezelfde fout?

Verwijderd

Topicstarter
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#define WriteIt(x,y) { \
      x y(*lt_LabelInfo);\
      if ( y.IsGoedLabel() ) \
      { \
        if ( !y.SchrijfNaarQueue() ) \
        { \
          Fire_Error( _bstr_t( _T("Could not write to queue-file") ) ); \
        } \
      } \
      else \
      { \
        Fire_Error( _bstr_t( _T("Erroneous label!") ) ); \
      } \
    }


Zo heb ik het nu opgelost... Werkt ok :)

Verwijderd

Topicstarter
Eventjes naar boven bumpen zodat de zwaar mannen hier even kunnen over nadenken over hoe ik deze macro als template-functie kan schrijven (die werkt in VS 6 natuurlijk ;) ).

Want 'k heb niet de rechten om VS7 te gebruiken :S

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Het is dus een bug in VS6 zoals [rml]MSalters in "[ C++] template-vraag"[/rml] zei. De workaround die hij geeft is de documented MS workaround voor deze 'shortcoming', terug te vinden in de Knowledge Base. Ergo je kunt deze macro niet terug omvormen naar template die in VS6 werkt, want zoals je 'm had gemaakt is ie gewoon correct volgens de regeltjes.

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

D'r valt niet veel over te denken, VC6 is buggy, en daar zul je je bij neer moeten leggen

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.


Verwijderd

Topicstarter
Sta me toe even MS uit te schelden ;)

En tja, volgens de regeltjes werkt het ook niet :D Dus ja, met macro dan maar zeker?


Thx mannen :)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 06 november 2003 @ 23:07:
Sta me toe even MS uit te schelden ;)
omdat jij verourderde software gebruikt terwijl die bug allang gefixed is?

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.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

.oisyn schreef op 07 november 2003 @ 00:23:
[...]
omdat jij verourderde software gebruikt terwijl die bug allang gefixed is?
Visual Studio 6 uit, let wel, 1998 (prehistorisch in computerland ;) ).

Professionele website nodig?


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 00:47
.oisyn schreef op 07 november 2003 @ 00:23:
omdat jij verourderde software gebruikt terwijl die bug allang gefixed is?
Jaja, in een nieuwe versie ala mucho euro's. Zo kan ik ook bugs fixen. Ze hebben ook vijf service packs de kans gehad om die bug te fixen.

[ Voor 14% gewijzigd door farlane op 07-11-2003 08:46 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
Inderdaad, en er zit ook een bug in de MIDL-compiler die een warning geeft van 'oleautomation', terwijl die eigenlijk volledig legaal is.

Verder nog een bug bij het aanmaken van een SAFEARRAY**-bevattende functie via de wizard dus tja :)

Zoals hierboven gezegd is geweest :) ze hebben al 5 SP's de tijd gehad die te fixen :D


ik gebruik momenteel de midl-compiler van VS7. Kweet nie of da legaal is ma swat :) Misschien kan ik hetzelfde doen voor de compiler en de linker?

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 17:14
farlane schreef op 07 november 2003 @ 08:45:
[...]
Jaja, in een nieuwe versie ala mucho euro's. Zo kan ik ook bugs fixen. Ze hebben ook vijf service packs de kans gehad om die bug te fixen.
Deze bug was niet in a service pack te fixen, omdat het link-compabiliteit breekt. De name mangling moest worden aangepast, en dat is dusdanig ingrijpend dat je dat niet in een Service Pack wil. Ook GCC heeft zo'n probleem gehad, en ook die hebben een 3.x+1 uit moeten brengen.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

farlane schreef op 07 november 2003 @ 08:45:
[...]


Jaja, in een nieuwe versie ala mucho euro's. Zo kan ik ook bugs fixen. Ze hebben ook vijf service packs de kans gehad om die bug te fixen.
Even de opmerking van MSalters buiten beschouwing gelaten, je kunt natuurlijk blijven doorzaniken over het feit dat die bug in VC6 destijds niet gefixed is, maar het punt blijft dat die bug nu wel gefixed is, en KaReL nog steeds van 5 jaar oude software gebruik maakt. Bovendien is VC7 zo duur niet, 100 euro voor een standaard versie als ik me niet vergis. Ik vindt dat een behoorlijk redelijke prijs voor een product als VC++ 7.1. En 100 euro op 5 jaar is natuurlijk al helemaal niets

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.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 17:14
Voor 50$ kun je Comeau als frontend van VC6 gebruiken, en dan heb je het probleem ook niet })

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 00:47
Mja ... het kan allemaal wel zijn maar op een of andere manier vind ik het altijd raar dat dit soort dingen bij software wel geaccepteerd wordt, terwijl het als het een ander produkt zou betreffen dat ervan wordt uitgegaan dat het onder de garantie valt.

Just my 2cts ...

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1