2010-07-09 2 views
3

Я не получаю специализацию частичного шаблона. Мой класс выглядит следующим образом:C++: специализация частичного шаблона

template<typename tVector, int A> 
class DaubechiesWavelet : public AbstractWavelet<tVector> { // line 14 
public: 
    static inline const tVector waveletCoeff() { 
    tVector result(2*A); 
    tVector sc = scalingCoeff(); 

    for(int i = 0; i < 2*A; ++i) { 
     result(i) = pow(-1, i) * sc(2*A - 1 - i); 
    } 
    return result; 
    } 

    static inline const tVector& scalingCoeff(); 
}; 

template<typename tVector> 
inline const tVector& DaubechiesWavelet<tVector, 1>::scalingCoeff() { // line 30 
    return tVector({ 1, 1 }); 
} 

ССАГПЗ выводит ошибки:

line 30: error: invalid use of incomplete type ‘class numerics::wavelets::DaubechiesWavelet<tVector, 1>’ 
line 14: error: declaration of ‘class numerics::wavelets::DaubechiesWavelet<tVector, 1>’ 

Я пробовал несколько решений, но никто не работал. У кого-нибудь есть подсказка для меня?

+0

'result (i)'? не должно ли это быть «результатом [i]» вместо этого? – 6502

+0

Я использую ublas boost, так что вы можете использовать (0) оператор – Manuel

ответ

3
template<typename tVector> 
inline const tVector& DaubechiesWavelet<tVector, 1>::scalingCoeff() { // line 30 
    return tVector({ 1, 1 }); 
} 

Это определение члена частичной специализации, которая будет определена следующим образом

template<typename tVector> 
class DaubechiesWavelet<tVector, 1> { 
    /* ... */ 
    const tVector& scalingCoeff(); 
    /* ... */ 
}; 

Это не специализация члена «scalingCoeff» основного шаблона «DaubechiesWavelet». Такая специализация требуется для передачи значения всех аргументов, которые ваша специализация не делает. Для того, чтобы делать то, что вы хотите, вы можете использовать перегрузку хотя

template<typename tVector, int A> 
class DaubechiesWavelet : public AbstractWavelet<tVector> { // line 14 
    template<typename T, int I> struct Params { }; 

public: 
    static inline const tVector waveletCoeff() { 
    tVector result(2*A); 
    tVector sc = scalingCoeff(); 

    for(int i = 0; i < 2*A; ++i) { 
     result(i) = pow(-1, i) * sc(2*A - 1 - i); 
    } 
    return result; 
    } 

    static inline const tVector& scalingCoeff() { 
    return scalingCoeffImpl(Params<tVector, A>()); 
    } 

private: 
    template<typename tVector1, int A1> 
    static inline const tVector& scalingCoeffImpl(Params<tVector1, A1>) { 
    /* generic impl ... */ 
    } 

    template<typename tVector1> 
    static inline const tVector& scalingCoeffImpl(Params<tVector1, 1>) { 
    return tVector({ 1, 1 }); 
    } 
}; 

Обратите внимание, что синтаксис инициализации вы используете, будет работать только в C++ 0x.

+0

! PS: Я знаю об ошибке инициализации, спасибо. – Manuel

4

Я не вижу класс специализированный. Вы должны специализировать класс и внутри него метод.

 Смежные вопросы

  • Нет связанных вопросов^_^