Я пытаюсь реализовать функцию шаблона с ручками void по-разному, используя специализированную специализацию.специализация шаблона для статических функций-членов; как?
Следующий код дает мне «Явное специализации в рамках без имен» в НКУ:
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();
}
}
Я пытался сдвинув его из класса (класс не шаблонный) и в пространстве имен, но то я получаю ошибку «Явная специализация не может иметь класс хранения». Я много читал об этом, но люди, похоже, не согласны с тем, как специализировать шаблоны функций. Есть идеи?
hm Я попробовал то же самое сейчас, но поместил его в файл .hpp и попытался включить его ... тогда я получаю ошибку «множественное определение vodi X: ff (тест ). Я не вижу, что будет Разница? –
Rolle
Была ли это ошибкой компилятора или компоновщика?Если это была ошибка компилятора, это означает, что вы, вероятно, включаете заголовок шаблона более одного раза, а защита заголовков отсутствует, и, следовательно, двойное определение: компилятор видит два (увы точно) определения для реализации. –
Почему я должен добавить встроенный для первого случая? Если нет, я получаю ошибку компиляции. – sop