Wachtwoord vergeten?

Wachtwoord vergeten
Vul hier uw email adres in. U ontvangt dan een nieuw wachtwoord.

PRB: LNK2001 bij sjabloonlidfuncties

Gepost op 28-01-2004 - Overige Microsoft Producten - 0 reacties


De informatie in dit artikel is van toepassing op:

  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++ 6.0 Standard Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition

Dit artikel is eerder gepubliceerd onder NL239436

Symptomen


U ontvangt het foutbericht LNK2001 voor sjabloonlidfuncties tenzij de lidfuncties ook zijn gedefinieerd in hetzelfde vertaalsegment.

Oorzaak


Het compileerprogramma ondersteunt het gebruik van het sleutelwoord 'export' niet, zoals dit is gedefinieerd in de onderstaande C++-standaard:

Sectie 14:


Paragraaf 7: Het declareren van een klassensjabloon als geëxporteerd heeft hetzelfde effect als het declareren van alle functieleden die niet in line zijn, alle statische gegevensleden, alle lidklassen, alle sjablonen voor lidklassen en alle sjablonen voor functieleden die niet in line zijn en die zijn gedefinieerd in het desbetreffende geëxporteerde vertaalsegment.


Paragraaf 8: Sjablonen die zijn gedefinieerd in een niet-benoemde naamruimte, worden niet geëxporteerd. Een sjabloon wordt slechts eenmaal in een programma geëxporteerd. Er is geen implementatie vereist om een schending van deze regel te ontdekken. Een niet-geëxporteerde sjabloon die niet expliciet is gespecialiseerd en waarvoor ook geen expliciete instantievorming heeft plaatsgevonden, moet in elk vertaalsegment zijn gedefinieerd waarin impliciet (temp.inst) of expliciet (temp.explicit) instantievorming van de sjabloon heeft plaatsgevonden; er is geen diagnose vereist. Een geëxporteerde sjabloon hoeft alleen te worden gedeclareerd (en niet noodzakelijkerwijs gedefinieerd) in een vertaalsegment waarin instantievorming van de sjabloon plaatsvindt. Een sjabloonfunctie die wordt gedeclareerd als geëxporteerd en in line, is gewoon in line en wordt niet geëxporteerd.

Oplossing


U hebt de volgende twee keuzen:
  • Houd de sjabloondeclaratie en definitie bij elkaar in een vertaalsegment.
  • Als u van te voren al weet hoe uw sjabloonklasse zal worden gebruikt in uw toepassing, kunt u expliciete instantievorming toepassen voor de sjabloonklasse.


    Zo wordt bijvoorbeeld voor de klasse MyStack die wordt gedeclareerd in Myprog.h
    template <class T> MyStack;
    en geïmplementeerd in Myprog.cpp, in de volgende instructie expliciete instantievorming toegepast op MyStack voor int-variabelen:
    template class MyStack<int>;

Meer informatie


Door expliciete instantievorming kunt u een exemplaar maken van een sjabloonklasse of -functie, zonder dat u deze daadwerkelijk gebruikt in uw programmacode. De bedoeling hiervan is dat instantievorming wordt toegepast voor alle mogelijke typen voor de sjabloonklasse in het implementatiebestand. Op die manier wordt, wanneer het .cpp-bestand wordt gecompileerd, de programmacode gegenereerd voor deze gemaakte exemplaren. Hierdoor komt de LNK2001-fout minder vaak voor.


Raadpleeg de Help bij Visual C++ voor meer informatie over expliciete instantievorming.

Referenties


Voor meer informatie klikt u op het volgende artikelnummer in de Microsoft Knowledge Base:

128789 BUG: LNK2001 on Member Function When Use Nested Class Template

PrintPrint RSS reactiesRSS reacties BookmarkBookmark

Gekoppelde tags

Foutbericht, .net, Visual C

Reacties
Nog geen reacties geplaatst.

Winkelmandje

Het winkelmandje is leeg

Inloggen
Als u hierboven op de knop 'bestellen' klikt krijgt u een overzicht van de door uw gewenste producten. Indien het overzicht compleet en correct is kunt via de wizard de verdere gegevens invullen en uw bestelling afronden. In het bestelproces kunt u altijd op 'vorige' drukken om terug te gaan in het proces. Bij Perrit staan vertrouwen, privacy en veiligheid op de eerste plaats, wij zullen uw gegevens dan ook met uiterste zorgvuldigheid behandelen en nooit doorgeven aan derden.

Perrit.nl Sherwood Rangers 29 Hengelo

Perrit.nl telefoon: +31 74 750 12 20

Kenniscentrum - PRB: LNK2001 bij sjabloonlidfuncties
Perrit Kenniscentrum - PRB: LNK2001 bij sjabloonlidfuncties