2017-06-15 2 views
0

Ich lese Caffe-Code und finde es Split C++ - Klasse Template-Code in hpp und cpp-Dateien. Beispielsweise enthält Net.cpp den Net-Implementierungscode der Schablonenklasse und Net.hpp enthält die Definition. Aber ich erinnere mich, dass es nicht möglich ist, eine Template-Klasse in hpp- und cpp-Dateien aufzuteilen, wie funktioniert das caffe? Danke.Wie teilt Caffe Vorlage Klassencode in cpp und hpp-Dateien?

+1

verwandt: https://stackoverflow.com/questions/115703/storing-c-template-funktion-definitions-in-a-cpp-file – NathanOliver

Antwort

0

Wie Sie notierten, template definitions cannot be split up as easily from the declarations ohne durch einige Reifen zu springen.

Ein häufiges Muster ist es, sie in verschiedenen Dateien für den menschlichen Leser zu teilen, aber im Wesentlichen sind sie immer noch alle in einem Header definiert. Zum Beispiel

foo.h

#pragma once 
template <typename T> 
void Foo(); // declaration 

#include "Foo.inl" 

Foo.inl

template <typename T> 
void Foo() 
{ 
    // actual definition 
} 

Beachten Sie, dass das letzte, was in der .h Datei enthält den vollständigen Inhalt der .inl Datei tatsächlich ist . Soweit der Compiler betroffen ist, sind alle Template-Definitionen in der Kopfzeile enthalten, um das von Ihnen erwähnte Anfangsproblem zu lösen. Aber für den menschlichen Leser sind die Erklärungen und Definitionen getrennt.

0

Sie können die Template-Definition und Verzögerung normalerweise nicht "trennen". Wenn der Compiler die Vorlage instanziiert, muss er genau die Definition und die Deklaration der Member kennen, die im Kontext verwendet werden. Wenn Sie also nur die Header-Datei angeben, kann der Compiler die Vorlage für den Template-Parameter nicht instanziieren.

Eine andere Lösung als die, die coryKramer erwähnt, ist nach der vollständigen Definition (in der .cpp-Datei) explizit die Vorlage für die Template-Parameter zu instanziieren, auf diese Weise ist die Vorlage bereits instanziiert für die Werte, die Sie würden gerne verwenden (an dieser Stelle haben wir die vollständige Deklaration und Definition der Vorlage). Beachten Sie jedoch, dass Fehler auftreten können, wenn die Vorlage für andere Werte instanziiert werden muss, da der Compiler nicht weiß, wie dieser Prozess ausgeführt wird, wenn die Vorlage in dieser Datei nicht vollständig definiert ist!

Dies ist die Methode, die in Caffe via INSTANTIATE_CLASS (Net) -Makro am Ende der CPP-Datei verwendet wird.

+0

Vielen Dank, ich habe nur den Code nachgeschlagen und Sie haben Recht. Wie verhält sich caffe mit Funktionsschablonen wie Funktionen in caffe/util/math_functions.cpp und math_functions.hpp? – XiongJi