C ++ linken voor een overbelaste << -functie (logger-klasse)

Ik ben momenteel bezig met het schrijven van een logger voor mijn C ++ -project (ik wil dat het bijna geen afhankelijkheden heeft, dus ik wil niet een vooraf geschreven). Het bevat deze functie:

template 
Logger& Logger::operator<<(T f) {
  m_file<

De code logger.cpp wordt gecompileerd, maar als ik de logboekfuncties in mijn main.cpp aanroept, heb ik deze compilerfout:

/home/tuxer/prog/cpp/PRay/server/src/main.cpp:110: undefined reference to `Logger& Logger::operator<< (int)'

voor deze regel code:

log<

Het logger.o-bestand is correct opgenomen, omdat de Logger :: init() -functie correct werkt en geen link-fout veroorzaakt. Bedankt :)

2

2 antwoord

Aangezien u niet-inline sjablonen hebt, moet u Instantiation forceren. Zie bijvoorbeeld Hoe forceer ik een specifieke instantie van een C ++ -sjabloon om te instantiëren? .

3
toegevoegd

The simple thing to do is to put the Logger::operator<< template in the header file. The compiler will automatically instantiate the versions it needs, and the linker will remove the duplicates (well, at least the ones that weren't inlined).

U hoeft Instantiation niet te forceren tenzij uw linker oud is (bijvoorbeeld gcc 2.7 of eerder).

Dit is de algemene regel met de sjablooncode: plaats de definities in het headerbestand tenzij u een goede reden hebt om dat niet te doen.

Zie Waarom kunnen sjablonen alleen in het headerbestand worden geïmplementeerd? ook.

2
toegevoegd
werkt als een charme, heel erg bedankt.
toegevoegd de auteur Tuxer, de bron