Domanda

ho convertito una funzione a un modello, e iniziato a ricevere questo errore. Non devo essere la comprensione di una limitazione di modelli. Qualcuno può dirmi perché questo è rotto?

sto ricevendo questo errore:

Undefined symbols:
  "bool foo<int>(int const&, int const&)", referenced from:
      _main in file1.o
ld: symbol(s) not found

Quando collego il seguente codice. Il codice è semplificato, ma ancora non riesce. Il primo file contiene:

#include <iostream>
template <class T> bool foo (const T&, const T&);

int main ()
{
  int left = 1;
  int right = 2;

  if (foo <int> (left, right))
    std::cout << "foo!" << std::endl;

  return 0;
}

E il secondo file contiene:

template <class T> bool foo (const T& left, const T& right)
{
  return true;
}
È stato utile?

Soluzione

Per la ragione Uri ha dato, i metodi di template sono solitamente definiti nel file di intestazione. Perché il vostro è una funzione e non un metodo di una classe, in modo esplicito definirla (nel file di intestazione che possono essere inclusi da più di un file CPP) come statico o in linea.

Mettete questo nella vostra foo.h

template<class T> inline bool foo (const T& left, const T& right)
{
  return true;
}

Mettete questo nella vostra main.cpp

#include <iostream>
#include "foo.h"

int main ()
{
  int left = 1;
  int right = 2;

  if (foo <int> (left, right))
    std::cout << "foo!" << std::endl;

  return 0;
}

Il codice cpp vede ora l'intera dichiarazione della funzione template.

Altre soluzioni sono elencate qui: Come posso evitare di linker errori con le mie funzioni modello?

Altri suggerimenti

E 'stato anni da quando ho fatto molto di C ++, ma penso che si è verificato un problema di compilazione separata. I modelli sono istanziati in fase di compilazione, non collega.

Di conseguenza, quando si effettua la chiamata a foo (), non siete veramente Instantiating il modello, nel senso che nessun nuovo codice della funzione viene generato, si sta solo creando un simbolo che il linker deve risolvere.

Tuttavia, quando il secondo file viene compilato, ha solo il modello e non è mai un'istanza, quindi viene generato alcun versione di foo () che si occupa in realtà con int. Di conseguenza, quando si collega tutto insieme, si ottiene l'errore.

Non sono sicuro al 100% che cosa fare su questo, ma ho il sospetto che si avrebbe bisogno di forzare un'istanza di foo () con interi in quel secondo file (supponendo che si tratta di un C ++). Ho lavorato solo con i modelli di classe, non modelli di funzione, sono sicuro che qualcuno qui vi darà il codice esatto in pochi ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top