Явная специализация в объеме непространства имен [дубликат]

Этот вопрос уже имеет ответ здесь:

template
class CConstraint
{
public:
    CConstraint()
    {
    }

    virtual ~CConstraint()
    {
    }

    template 
    void Verify(int position, int constraints[])
    {       
    }

    template <>
    void Verify(int, int[])
    {   
    }
};

Компиляция этого под g ++ дает следующую ошибку:

Явная специализация в непространстве имен определяет объем 'класса CConstraint'

В VC это компилирует прекрасный. Кто-либо может сообщить мне обходное решение?

121
задан Alex Wilson 4 July 2012 в 19:30
поделиться

2 ответа

VC ++ в этом случае несовместим - явные специализации должны находиться в области пространства имен. C ++ 03, §14.7.3 / 2 :

Явная специализация должна быть объявлена ​​в пространстве имен, членом которого является шаблон, или, для шаблонов членов, в пространстве имен которого охватывающий класс или включающий шаблон класса является членом.
Явная специализация функции-члена, класса-члена или статического члена данных шаблона класса должна быть объявлена ​​в пространстве имен, членом которого является шаблон класса.

Кроме того, у вас есть проблема, заключающаяся в том, что вы не можете специализировать функции-члены без явной специализации содержащего класса из-за C ++ 03, §14.7.3 / 3 , поэтому одним из решений было бы позволить Verify () переадресовывает, возможно, специализированную бесплатную функцию:

namespace detail {
    template <typename TL> void Verify     (int, int[]) {}
    template <>            void Verify<int>(int, int[]) {}
}

template<typename T> class CConstraint {
    // ...
    template <typename TL> void Verify(int position, int constraints[]) {
        detail::Verify<TL>(position, constraints);
    }
};
92
ответ дан 24 November 2019 в 01:32
поделиться

Другой способ решения этой проблемы - делегирование частной функции и перегрузка этой функции. Таким образом, у вас сохраняется доступ к данным члена *this и к внешнему типу параметра шаблона.

template<typename T>
struct identity { typedef T type; };

template<typename T>
class CConstraint
{
public:

  template <typename TL>
  void Verify(int position, int constraints[])
  {
    Verify(position, constraints, identity<TL>());
  }

private:
  template<typename TL>
  void Verify(int, int[], identity<TL>)
  {

  }

  void Verify(int, int[], identity<int>)
  {

  }
};
89
ответ дан 24 November 2019 в 01:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: