Próbuję zaimplementować funkcję szablonu z uchwytami unieważniającymi inaczej przy użyciu specjalizacji szablonu.Specjalizacja szablonu dla statycznych funkcji składowych; jak?
Poniższy kod daje mi „Explicit specjalizacji w zakresie non-namespace” w gcc:
template <typename T>
static T safeGuiCall(boost::function<T()> _f)
{
if (_f.empty())
throw GuiException("Function pointer empty");
{
ThreadGuard g;
T ret = _f();
return ret;
}
}
// template specialization for functions wit no return value
template <>
static void safeGuiCall<void>(boost::function<void()> _f)
{
if (_f.empty())
throw GuiException("Function pointer empty");
{
ThreadGuard g;
_f();
}
}
Próbowałem przesuwając go z klasy (klasa nie jest na matrycy) oraz w przestrzeni nazw, ale wtedy pojawia się błąd "Wyraźna specjalizacja nie może mieć klasy pamięci". Czytałem wiele dyskusji na ten temat, ale ludzie nie zgadzają się, jak specjalizować szablony funkcji. Jakieś pomysły?
hm Próbowałem już tego samego, ale umieść go w pliku .hpp i próbowałem go włączyć ... potem pojawia się błąd "wielokrotna definicja vodi X: ff (Test ) .Nie widzę, co by być różnica? –
Rolle
Czy był to błąd kompilatora lub linkera?Jeśli był to błąd kompilatora, oznacza to, że prawdopodobnie zawiera on nagłówek szablonu więcej niż jeden raz i brakuje osłon nagłówka, a tym samym podwójną definicję: kompilator widzi dwie (niestety dokładnie dokładne) definicje dla implementacji. –
Dlaczego powinienem dodać wbudowany pierwszy przypadek? Jeśli nie, otrzymuję błąd kompilacji. – sop