Этот вопрос уже имеет ответ здесь:
template
class CConstraint
{
public:
CConstraint()
{
}
virtual ~CConstraint()
{
}
template
void Verify(int position, int constraints[])
{
}
template <>
void Verify(int, int[])
{
}
};
Компиляция этого под g ++ дает следующую ошибку:
Явная специализация в непространстве имен определяет объем 'класса CConstraint'
В VC это компилирует прекрасный. Кто-либо может сообщить мне обходное решение?
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);
}
};
Другой способ решения этой проблемы - делегирование частной функции и перегрузка этой функции. Таким образом, у вас сохраняется доступ к данным члена *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>)
{
}
};