2010-07-09 18 views
3

Je ne reçois pas la spécialisation de modèle partiel. Ma classe ressemble à ceci:C++: Spécialisation de modèle partiel

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 }); 
} 

Les sorties gcc d'erreur est:

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>’ 

J'ai essayé plusieurs solutions, mais aucun travaillé. Quelqu'un a un indice pour moi?

+0

'résultat (i)'? cela ne devrait-il pas être 'result [i]' à la place? – 6502

+0

J'utilise ublas boost, donc là vous pouvez utiliser l'opérateur() – Manuel

Répondre

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

C'est une définition d'un membre d'une spécialisation partielle qui serait définie comme suit

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

Ce n'est pas une spécialisation du membre « scalingCoeff » du modèle primaire « DaubechiesWavelet ». Une telle spécialisation est nécessaire pour transmettre la valeur de tous les arguments, ce que votre spécialisation ne fait pas. Pour faire ce que vous voulez, vous pouvez utiliser la surcharge si

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 }); 
    } 
}; 

Notez que la syntaxe d'initialisation que vous utilisez ne fonctionnera que dans C++ 0x.

+0

acclamations! PS: Je connais le problème d'initialisation, merci. – Manuel

4

Je ne vois pas la classe spécialisée. Vous devez spécialiser la classe, et à l'intérieur, la méthode.