Frage

Ich bin vor ein paar Probleme mit „undefined Verweis auf“ Fehler. Ich kann den Code nicht in der Lage zu schreiben, aber die Erklärungen und die Art, wie ich die Funktionen nenne sind wie folgt:

Erklärungen:

template <typename T>
int pitch_detect(deque<T>& x, int offset, int len);

template <typename T>
int is_voiced(
  deque<T>& x, int offset, int len,
  double avg_energy, int pre_voice,
  short& s_flag,
  long nsamples
);

Ich rufe die oben genannten Funktionen wie folgt:

x = is_voiced(superFrame_, cur_offset_, f_len_,
    avgEnergy_, frame_voicing_[1], silence_flag_, nsamples_);

y = pitch_detect(superFrame_, cur_offset_, f_len_);

Die obigen Ausführungen (wo ich die Funktionen nenne), erhalten als Fehler gekennzeichnet. Dies sind die Meldungen:

  

undefined reference to `int   is_voiced (std :: deque> &, int, int,   Doppel, int, kurz & lang)

     

undefined reference to `int   pitch_detect (std :: deque> &, int, int)

Jede Hilfe der obigen Fehler bei der Decodierung ist höchst willkommen. Vielen Dank, Sriram

Edit: Die oben genannten Funktionen werden in einem separaten Header definiert und C ++ Datei entspricht. Ich bekomme keine Probleme, wenn ich versuche, sie zu kompilieren und eine Objektdatei zu erstellen. Diese Fehler werden in der Linker Bühne zu sehen.

War es hilfreich?

Lösung

Haben Sie Definitionen für diese Vorlagen zur Verfügung gestellt? Sind Sie explizit die Vorlagen selbst oder die Möglichkeit der Compiler Instanziieren sie zu instanziiert?

Wenn Sie eine Vorlage Erklärung einreichen, aber der Compiler nicht sieht die Definition in der gleichen Übersetzungseinheit, es wird angenommen, dass die Vorlage wird in einer anderen Übersetzungseinheit instanziiert wird und wird nur um den Anruf generieren, aber nicht kompilieren (ohne zu sehen die Definition kann es vielleicht tun es nicht) die spezifische Instanziierung. Später beim Linken wird der Linker den Anruf sehen, aber nicht die Instanziierung sehen und wird nicht mit dem undefined reference Fehler.

Die einfachste Lösung ist, die nur die Template-Deklaration und Definition zusammen:

template <typename T>
int is_voiced( deque<T>& x, int offset, int len, double avg_energy, int pre_voice, short& s_flag, long nsamples ) 
{
  // code here
}

Wenn Sie dann den Compiler verwenden is_voiced(...) wird die Vorlage für Sie implizit instanziiert (es den Code sieht, und es wird es kompilieren).

Es gibt einige Fälle, in denen Sie den Compiler nicht instanziiert implizit wollen Ihre Vorlagen (Sie wissen, welche Arten verwendet werden werden, und Sie wollen nicht der Compiler andere Nutzungen ermöglichen --oder es zu kompilieren teuer und will Geschwindigkeit Kompilierung, indem nur die Vorlagen in einer einzigen Übersetzungseinheit Instanziieren). Für diese Fälle müssen Sie Ihre eigene explizite Instanziierung in einer Übersetzungseinheit zur Verfügung zu stellen.

// header
template <typename T>
int is_voiced( deque<T>& x, int offset, int len, double avg_energy, int pre_voice, short& s_flag, long nsamples ); 

// cpp
template <typename T>
int is_voiced( deque<T>& x, int offset, int len, double avg_energy, int pre_voice, short& s_flag, long nsamples ) {
   // code goes here
}
// explicit instantiation for int
template int is_voiced( deque<int>& x, int offset, int len, double avg_energy, int pre_voice, short& s_flag, long nsamples );

kompiliert dann diese Implementierungsdatei und verknüpft es mit dem Rest des Projektes.

. Hinweis: es ist ratsam, die vollständige Template-Definition in der Kopfzeile zur Verfügung zu stellen, so dass der Compiler implizit instanziieren kann, es sei denn, Sie haben einen guten Grund dies nicht zu tun

Andere Tipps

Setzen Sie die Definitionen der Funktionen in der Header-Datei, statt in einer separaten CPP-Datei; und, in der Header-Datei, die das Präfix Funktionsdefinitionen mit dem inline Schlüsselwort, den Linker beschweren sich über doppelte Definitionen zu vermeiden.

Ich habe nicht versucht g ++, aber haben Sie versucht, ausdrücklich auf die Art der Benennung?

x = is_voiced<PutTypeNameHere>(superFrame_, etc);

Sind die Definitionen und die Berufung von derselben DLL / exe getan? Wenn nicht, müssen Sie sich unter Umständen explizit die Template-Funktionen mit den Typen instanziiert Sie anrufen sie mit.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top