оператор () специализация шаблона - PullRequest
5 голосов
/ 29 декабря 2011

Я пытаюсь сделать специализацию для оператора шаблона, шаблон выглядит так:

 template <typename Iterator1, typename Iterator2>
ResultType operator()(Iterator1 a, Iterator2 b, size_t size, ResultType worst_dist = -1) const

после того, как я сделал специализацию, которая выглядит следующим образом:

template <>
float operator()<float*,float*>(float* a, float const* b, unsigned long size, float worst_dist = -1) const

я получаю ошибку во время компиляции:

Невозможно специализировать функцию 'operator ()' в области видимости класса

Все эти функции находятся в шаблоне структуры

Я буду рад получить помощь. спасибо.

1 Ответ

9 голосов
/ 29 декабря 2011

Почему вы хотите так или иначе специализировать этого оператора?Вы не сможете вызывать его, используя синтаксис, который зависит от специализаций (то есть, явно предоставляя [некоторые из] аргументов шаблона) в любом случае!Просто используйте перегрузку и у вас все будет хорошо.Хотя иногда желательно или даже необходимо использовать нотацию, в которой вы явно указываете аргументы шаблона, обычно для функций не так важно использовать специализацию, а не перегрузку.

Я просто читаю вещистандарт и фактически можно обеспечить явную специализацию, однако это должно быть за пределами определения класса.Например:

#include <iostream>

struct foo
{
    template <typename T> void operator()(T const&) {
        std::cout << "general\n";
    }
};

template <>
void foo::operator()<int>(int const&) {
    std::cout << "int spec\n";
}

int main()
{
    foo f;
    f(1.2);
    f(1);
    f<double>(1); // <-- ERROR: doesn't work!
}

Это работало бы так же, используя перегрузку.Однако использование явно заданных аргументов шаблона по-прежнему не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...