Вопрос C ++ о частичной специализации - PullRequest
5 голосов
/ 09 июня 2011

У меня проблемы со временем компиляции со следующим кодом:

  template <typename T, 
            template <class T, class Allocator = std::allocator<T> > class C>
  bool is_in(const C<T>& a, const C<T>& b);

  template <typename T, std::vector> // HERE
  bool is_in(const std::vector<T>& a, const std::vector<T>& b)
  {
    return false; // implementation tbd
  }

...

vector<int> a, b;

cout << is_in(a,b) << endl;

Сообщение об ошибке (в строке, помеченной "ЗДЕСЬ"):

error: 'std::vector' is not a type

(конечно, У меня есть включенный вектор из std!).Любое предложение?Некоторое время я возился с этим, но дошел до того, что я мог бы использовать некоторую помощь :-) Мне нужно частично специализировать первоначальное объявление шаблона, чтобы иметь возможность реализации переключателя компилятора в зависимости от фактического типаконтейнер C (будет is_in для наборов, один для векторов, один для диапазонов ..., каждый раз с разными алгоритмами).

Спасибо!

Ответы [ 3 ]

6 голосов
/ 09 июня 2011

Стандарт не допускает частичной специализации шаблона функции.

Простое решение: используйте перегрузку.

template <typename T> 
bool is_in(const std::vector<T>& a, const std::vector<T>& b)
{
  return false; // implementation tbd
}

Это перегруженный шаблон функции. Это НЕ частичная специализация.

Или вы можете сделать это:

namespace detail
{
    template<typename T, typename C>
    struct S
    {
        static bool impl(const C & a, const C & b)
        {
            //primary template
            //...
        }
    }
    template<typename T>
    struct S<T, std::vector<T> >
    {
        static bool impl(const std::vector<T> & a, const std::vector<T> & b)
        {
            //partial specialization for std::vector
            return false;
        }
    }
}

template <typename T,  template <class T, class Allocator = std::allocator<T> > class C>
bool is_in(const C<T>& a, const C<T>& b)
{
   return detail::S<T, C<T> >::impl(a,b);
}
1 голос
/ 10 июня 2011

Частичная специализация шаблона функции не разрешена. В любом случае вы не используете синтаксис специализации шаблона, вы фактически пишете дополнительную перегрузку. Попробуйте вместо этого:

template <typename T>
bool is_in(const std::vector<T>& a, const std::vector<T>& b)
{
    return false; // implementation tbd
}

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

template <typename T> // std::vector is not a template parameter,
                      // so we wouldn't put it here
bool is_in<T, std::vector>(const std::vector<T>& a, const std::vector<T>& b)
// instead, it'd appear ^ here, when we're specializing the base template
{
    return false; // implementation tbd
}
0 голосов
/ 10 июня 2011

Я не знаю, работает ли он (так как шаблоны шаблонов всегда являются проблемой для меня), но как насчет того, чтобы просто попробовать

template <typename T>
bool is_in(const std::vector<T>& a, const std::vector<T>& b)
{
    ...
}

, поскольку это специализация.

РЕДАКТИРОВАТЬ: Другие уже разъяснили это, но я добавлю его для полноты.Приведенный выше код на самом деле является перегрузкой, а не частичной специализацией, но частичная специализация функций все равно не разрешена.

...