Angenommen, ich einen Header wrapper.h
haben:Ist es möglich, Vorlage explizit zu labda zu spezialisieren?
template <typename Func> void wrapper(const Func func);
und eine Datei wrapper.cpp
enthält:
#include "wrapper.h"
template <typename Func>
void wrapper(const Func func)
{
func();
}
Und eine Datei main.cpp
enthält:
#include "wrapper.h"
#include <iostream>
int main()
{
wrapper([](){std::cout<<"hello."<<std::endl;});
}
Wenn ich diese zusammen kompilieren (zB cat wrapper.cpp main.cpp | g++ -std=c++11 -o main -x c++ -
), bekomme ich keinen Linker e Richtig.
Aber wenn ich sie separat kompilieren (zB g++ -std=c++11 -o wrapper.o -c wrapper.cpp && g++ -std=c++11 -o main main.cpp wrapper.o
), I --- --- natürlich einen Linker Fehler:
Undefined symbols for architecture x86_64:
"void wrapper<main::$_0>(main::$_0)", referenced from:
_main in main-5f3a90.o
Normalerweise könnte ich ausdrücklich wrapper
spezialisieren und so etwas wie dies in den wrapper.cpp
:
template void wrapper<void(*)()>(void(*)())
Aber diese spezielle Template-Spezialisierung funktioniert nicht.
Ist es möglich, eine Vorlage auf einem Lambda zu spezialisieren?
Sie könnten das Lambda immer in diesen Funktionszeiger konvertieren. – chris
Da der Vorlagencode in einer 'cpp'-Datei enthalten ist, meintest du _explicit template instanziation_? –
'Vorlage void wrapper (void (*)())' ist ** explizite Instanziierung ** nicht ** Spezialisierung **, wie Sie es nennen. Es gibt einen [Unterschied] (http://stackoverflow.com/a/4933205/1621391) zwischen den beiden –
WhiZTiM